9

PL/SQLを使用して毎日の統計を取得しようとしています。

毎日いくつかのエントリ、エラーの束があります:-)私はそれらを日ごとにグループ化したいです。

私が現在していること:

SELECT TO_CHAR(dateTime, 'DD') DAY, TO_CHAR(dateTime, 'MM') MONTH, errormessage
FROM log
WHERE (...)
GROUP BY MONTH, DAY, errormessage

これにより、ORA-00904: "DAY":無効な識別子(group byで停止)になります。

何か助けはありますか?:D

4

3 に答える 3

19
SELECT TO_CHAR(dateTime, 'DD') DAY, TO_CHAR(dateTime, 'MM') MONTH, errormessage
FROM log
WHERE (...)
GROUP BY TO_CHAR(dateTime, 'DD'), TO_CHAR(dateTime, 'MM'), errormessage

列のエイリアスは適切ではありませんGROUP BY。完全な式が必要です。

于 2012-04-12T12:07:14.287 に答える
4

あなたの問題はスコープの問題です。GROUP BY句はステートメントのテーブル式の一部であるため、句の前に評価されますSELECT。つまり、射影です。これは、投影されたエイリアスがグループ化時に使用できないことを意味します。これは1つの解決策です

SELECT DAY, MONTH, errormessage
FROM (
  SELECT TO_CHAR(dateTime, 'DD') DAY, TO_CHAR(dateTime, 'MM') MONTH, errormessage
  FROM log
  WHERE (...)
)
GROUP BY MONTH, DAY, errormessage

これは別です:

SELECT TO_CHAR(dateTime, 'DD') DAY, TO_CHAR(dateTime, 'MM') MONTH, errormessage
FROM log
WHERE (...)
GROUP BY TO_CHAR(dateTime, 'MM'), TO_CHAR(dateTime, 'DD'), errormessage

非標準の動作

一部のデータベース(MySQL、PostgreSQLなどを含む)では、GROUP BY句のプロジェクションから列エイリアスを参照できることに注意してください。より厳密なSQL方言(Oracleなど)では、これは不可能ですが

于 2012-04-12T12:07:01.160 に答える
2
SELECT TO_CHAR(dateTime, 'DD') DAY, TO_CHAR(dateTime, 'MM') MONTH, errormessage
FROM log
WHERE (...)
GROUP by TO_CHAR(dateTime, 'DD'), TO_CHAR(dateTime, 'MM'), errormessage

groupbyでエイリアスを使用することはできません

于 2012-04-12T12:07:10.603 に答える