在oracle sql查询中按年后接月的日期对结果进行排序

klr1opcd  于 2023-04-20  发布在  Oracle
关注(0)|答案(2)|浏览(174)

我有这个查询来分组,并以Month_yeat和count格式显示结果。

SELECT
    TO_CHAR (D_DATE,
    'MON')

         || '_'

         || TO_CHAR (D_DATE,
    'YYYY') Month_Year,
    COUNT (*) Request_Count
FROM
    MY_TABLE WHERE V_TYPE='ABCD'
GROUP BY
    TO_CHAR (D_DATE,
    'MON') || '_' || TO_CHAR (D_DATE,
    'YYYY')
    
ORDER BY
    1;

我要求输出应根据年排序,然后第一个月。例如:当前输出为:

MAR_2023    2223
FEB_2023    433
MAY_2022    10
APR_2022    77

所需输出为:

FEB_2023    433
MAR_2023    2223
APR_2022    77
MAY_2022    10

我知道这是排序的基础上按字母顺序,如果我给予的条件,但需要一个解决方案,可以解决这个问题注:将年份和月份分组为单独的列并按其排序是不可接受的。

ogq8wdun

ogq8wdun1#

你可以,但是使用group byorder by子句的附加部分,例如

SELECT TO_CHAR (D_DATE, 'MON') || '_' || TO_CHAR (D_DATE, 'YYYY') Month_Year,
         COUNT (*) Request_Count
    FROM MY_TABLE
   WHERE V_TYPE = 'ABCD'
GROUP BY TO_CHAR (D_DATE, 'MON') || '_' || TO_CHAR (D_DATE, 'YYYY'),
         TO_CHAR (d_date, 'yyyymm')
ORDER BY TO_CHAR (d_date, 'yyyymm')
  • order by将确保行正确排序
  • 然后group by也需要它(否则您将得到“ORA-00979:不是GROUP BY表达式”错误)
fzwojiic

fzwojiic2#

将日期截断为月份的开始并按该日期分组,然后按截断的日期而不是格式化的字符串排序。

SELECT TO_CHAR(TRUNC(D_DATE, 'MM'), 'MON_YYYY') Month_Year,
       COUNT (*) Request_Count
FROM   MY_TABLE
WHERE  V_TYPE='ABCD'
GROUP BY TRUNC(D_DATE, 'MM')
ORDER BY TRUNC(D_DATE, 'MM');

其中,对于样本数据:

CREATE TABLE my_table (v_type, d_date) AS
SELECT 'ABCD', DATE '2022-01-01' + LEVEL FROM DUAL CONNECT BY LEVEL <= 19 UNION ALL
SELECT 'ABCD', DATE '2023-01-01' + LEVEL FROM DUAL CONNECT BY LEVEL <= 12 UNION ALL
SELECT 'ABCD', DATE '2023-02-01' + LEVEL FROM DUAL CONNECT BY LEVEL <=  5 UNION ALL
SELECT 'ABCD', DATE '2023-03-01' + LEVEL FROM DUAL CONNECT BY LEVEL <=  7;

输出:
| 月_年|请求计数|
| --------------|--------------|
| 2022年1月|十九岁|
| 2023年1月|十二岁|
| 2023年2月|五|
| 2023年3月|七|
fiddle

相关问题