【问题标题】:Oracle Group By Month, Year, Order by Year, MonthOracle 按月、年、按年、月排序
【发布时间】:2018-06-01 05:27:00
【问题描述】:

我正在尝试在 Oracle 中编写一个查询,该查询将按月和年对日期进行分组,然后将它们整齐地排序。 除此之外,月份必须显示它的名称而不是它的月份编号。

我目前的查询是:

SELECT to_char(datumgeleend, 'MONTH') as "Maand geleend", 
to_char(datumgeleend, 'YYYY') as "Jaar geleend", SUM(bedrag)
FROM lening
GROUP BY to_char(datumgeleend, 'MONTH'), to_char(datumgeleend, 'YYYY')
ORDER BY to_char(datumgeleend, 'YYYY'), to_char(datumgeleend, 'MONTH') DESC;

问题是顺序按月份的第一个字母而不是月份的数字。

所以我想修正一下,我将查询稍微调整为:

SELECT to_char(datumgeleend, 'MONTH') as "Maand geleend", 
to_char(datumgeleend, 'YYYY') as "Jaar geleend", SUM(bedrag)
FROM lening
GROUP BY to_char(datumgeleend, 'MONTH'), to_char(datumgeleend, 'YYYY')
ORDER BY to_char(datumgeleend, 'YYYY'), extract(month from datumgeleend) 
DESC;

不幸的是,这个查询产生了以下错误:

ORA-00979: not a GROUP BY expression

【问题讨论】:

    标签: oracle group-by sql-order-by


    【解决方案1】:

    只需在 group by 子句中添加extract(month from datumgeleend)

    SELECT to_char(datumgeleend, 'MONTH') as "Maand geleend", 
    to_char(datumgeleend, 'YYYY') as "Jaar geleend", SUM(bedrag)
    FROM lening
    GROUP BY to_char(datumgeleend, 'MONTH'), to_char(datumgeleend, 'YYYY'), extract(month from datumgeleend)
    ORDER BY to_char(datumgeleend, 'YYYY'), extract(month from datumgeleend) DESC;
    

    【讨论】:

    • 啊,是的,它完美地完成了这项工作!我没有意识到它也必须放在 GROUP BY 中。最后,我不得不拿走 DESC 以使其正确排序,但这与问题无关:)谢谢您的回答!
    【解决方案2】:

    一个简单的解决方法,使用 WITH factoring 子句,附加列(必须包含在 GROUP BY 子句中)用于根据需要对数据进行排序):

    WITH temp AS (
      SELECT
        TO_CHAR(datumgeleend,'MONTH') AS maand_geleend,
        TO_CHAR(datumgeleend,'YYYY') AS jaar_geleend,
        SUM(bedrag) sum_bedrag,
       --
        TO_CHAR(datumgeleend,'yyyymm') yyyymm
      FROM
        lening
      GROUP BY
        TO_CHAR(datumgeleend,'MONTH'),
        TO_CHAR(datumgeleend,'YYYY'),
        TO_CHAR(datumgeleend,'yyyymm')
    ) SELECT
      maand_geleend,
      jaar_geleend,
      sum_bedrag
      FROM
      temp
    ORDER BY
      yyyymm DESC;
    

    【讨论】:

    • 哦,感谢您的解决方法,很高兴知道这是可能的 :D 另一个解决方案虽然更简单,但我选择它作为答案,以便其他有类似问题的人更容易!谢谢你的回答!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-12
    • 2016-04-16
    • 1970-01-01
    • 1970-01-01
    • 2015-12-17
    • 1970-01-01
    相关资源
    最近更新 更多