Мне нужно, чтобы мои данные отображались с 2016 года по сегодняшний день ежемесячно - PullRequest
0 голосов
/ 09 мая 2018

У меня есть таблица Product, и я хочу знать о количестве продуктов ежемесячно с 2016 года по настоящее время.

Example:
January     15    2016
February    25    2016
March       05    2016
April       12    2016

Я использую этот запрос Oracle:

SELECT TO_CHAR(LOGIN_DATE, 'Month') As "Month",
       login_date, 
       Count(TO_CHAR(LOGIN_DATE, 'Month')) 
from Product 
group by TO_CHAR(LOGIN_DATE, 'Month')"

Но он показывает ошибку не группы по выражению.

Нужны предложения по этому вопросу.

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Проблема в том, что в вашем операторе SELECT есть столбец, который не агрегирован и не включен в предложение GROUP BY (login_date):

SELECT TO_CHAR(LOGIN_DATE, 'Month') As "Month",
       login_date, 
       ^^^^^^^^^^^
       Count(TO_CHAR(LOGIN_DATE, 'Month')) 
  from Product 
 group by TO_CHAR(LOGIN_DATE, 'Month')

Я подозреваю, что вы хотите что-то более похожее на следующее (помните, что COUNT(*) более интуитивно понятен, чем Count(TO_CHAR(LOGIN_DATE, 'Month')) - и вам также не придется беспокоиться о случаях, когда login_date равен NULL):

SELECT TO_CHAR(login_date, 'Month YYYY'), COUNT(*)
  FROM product 
 GROUP BY TO_CHAR(login_date, 'Month YYYY');

Обратите внимание, что я также включил год в маску даты для TO_CHAR() - в противном случае вы рискуете объединиться вместе за два месяца (скажем, январь 2016 года и январь 2017 года). Лично я бы использовал TRUNC(login_date, 'MONTH') (это вернет первое число месяца) и оставил бы форматирование клиенту:

SELECT TRUNC(login_date, 'MONTH'), COUNT(*)
  FROM product 
 GROUP BY TRUNC(login_date, 'MONTH');

Надеюсь, это поможет.

0 голосов
/ 09 мая 2018

Правильно использовать функцию EXTRACT с вложенным SQL:

SELECT Year, Month, count(1) countOfProd 
  FROM
  (
   SELECT extract( month from LOGIN_DATE ) Month,
          extract( year  from LOGIN_DATE ) Year              
     FROM Product
  )  
 GROUP BY Year, Month
 ORDER BY 1,2;

Демонстрация SQL Fiddle

...