#sql #oracle #date #analytics
#sql #Oracle #Дата #аналитика
Вопрос:
У меня есть набор данных, я хочу отображать транзакции в месяц за последние 12 месяцев, сгруппированные и упорядоченные по месяцам.
Мой код в настоящее время:
SELECT
to_char(orderdate, 'MM-YYYY') AS MONTH_AND_YEAR
,SUM(VALUE) AS TOTAL_SALES
,ROUND(AVG(VALUE),2) AS AVERAGE_SALE_VALUE
,MIN(VALUE) AS MINIMUM_SALE_VALUE
,MAX(VALUE) AS MAXIMUM_SALES_VALUE
FROM ORDER_TABLE
WHERE OrderDate >= ADD_MONTHS( TRUNC(SYSDATE), -12 )
GROUP BY to_char(orderdate, 'MM-YYYY')
ORDER BY to_char(orderdate, 'MM-YYYY') DESC;
но возвращается :
МЕСЯЦ_И_ГОД
12-2021
12-2020
11-2021
11-2020
10-2021
10-2020
09-2021
09-2020
08-2021
08-2020
07-2020
06-2020
05-2021
05-2020
04-2021
04-2020
03-2021
03-2020
02-2020
01-2021
01-2020
полезно:
MAX(ДАТА ЗАКАЗА) | MIN(ДАТА ЗАКАЗА) |
---|---|
2021-12-01 00:00:00 | 2020-01-02 00:00:00 |
Заранее благодарим вас за помощь и советы
Комментарии:
1. Для дат гораздо эффективнее группировать и упорядочивать по
trunc(orderdate, 'mm')
— не используйте здесь строки. Затемselect
вам все равно нужно будет использоватьto_char
, но вот так:select to_char(trunc(orderdate, 'mm'), 'mm-yyyy'), ....
(потому что вы должны ссылаться на ГРУППУ ПО выражению, которым в данном случае являетсяtrunc(...)
).
Ответ №1:
Вы можете использовать:
ORDER BY MIN(orderdate) DESC;
Упорядочение по строковому представлению, начинающемуся с месяца, не даст желаемых результатов.
Ответ №2:
вы можете попробовать order by TO_NUMBER(TO_CHAR(orderdate,'MM'))
извлечь месяц в виде числа, а затем использовать его для упорядочения по.
Комментарии:
1. Это все равно будет группировать один и тот же месяц из обоих лет (январь 2020, январь 2021, февраль 2020, февраль 2021, …) — именно то, что OP делает сейчас, и чего он не хочет. Для вашего собственного использования обратите внимание, что
extract(month from orderdate)
это гораздо более простой способ сделать то, с чем вы работалиto_number(........)
. В любом случае — этот ответ бесполезен.