Как группировать по дням в PL / SQL?

Im пытается получить статистику за каждый день с PL / SQL.

каждый день есть несколько записей, букеты ошибок: -) я хочу сгруппировать их по дням.

что я сейчас делаю:

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

это приводит к ORA-00904:" день": недопустимый идентификатор (останавливается на группе by).

помочь? : D

3 ответов


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, вам нужно полное выражение.


ваша проблема является проблемой области. The GROUP BY предложение является частью табличного выражения оператора и, таким образом, оценивается перед SELECT П., Т. е. проекция. Это означает, что ваши проецируемые псевдонимы недоступны во время группировки. Это одно из решений

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) это не должно быть возможно, хотя


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