Отображение данных только по месяцам и годам в SQL (Oracle)

#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(........) . В любом случае — этот ответ бесполезен.