【问题标题】:How to group by month and year?如何按月和年分组?
【发布时间】:2021-03-10 21:11:06
【问题描述】:

我有一个 PURCHASE 表,其中包含一个日期列 PURCHASEDATE,它是 DATE 格式。我正在尝试按月和年对购买进行分组。为此,我尝试:

SELECT 
TO_CHAR(PURCHASEDATE, 'MM YYYY') AS MONTHYEAR 
FROM PURCHASE
GROUP BY TO_CHAR(PURCHASEDATE, 'MM YYYY');

我也尝试过GROUP BY EXTRACT(MONTH FROM PURCHASEDATE), EXTRACT(YEAR FROM PURCHASEDATE),但都没有成功。

我对 SQL 查询很生疏:S.

编辑

表格列

先谢谢了!

【问题讨论】:

  • 使用购买表中的列进行编辑,这是您要问的吗?
  • 你期望的输出是什么?
  • 我想显示按月和年分组的购买。如果 2020 年 11 月有两个,我只需要 1 行
  • 您的cases 没有问题,您也可以在SELECT 列表中添加一些聚合,例如SUM(total) AS total, COUNT(code) AS count

标签: sql oracle date select group-by


【解决方案1】:

这是你想要的吗?

SELECT 
    TO_CHAR(PURCHASEDATE, 'MM YYYY') AS MONTHYEAR,
    SUM(TOTAL) AS TOTAL
FROM PURCHASE
GROUP BY
    TO_CHAR(PURCHASEDATE, 'MM YYYY');

【讨论】:

  • 我现在明白了,问题是某些聚合函数是强制性的。谢谢!
  • @JuanPizaFerra 这不是强制性的,你可以有GROUP BY 没有任何聚合函数db<>fiddle(但是,你需要在GROUP BY 中包含所有非聚合列)。跨度>
【解决方案2】:

如果你有样本数据:

CREATE TABLE purchase ( purchasedate ) AS
SELECT DATE '2019-01-01' + LEVEL - 1 FROM DUAL CONNECT BY LEVEL <= 5 UNION ALL
SELECT DATE '2019-02-01' + LEVEL - 1 FROM DUAL CONNECT BY LEVEL <= 3 UNION ALL
SELECT DATE '2020-01-01' + LEVEL - 1 FROM DUAL CONNECT BY LEVEL <= 3 UNION ALL
SELECT DATE '2020-02-01' + LEVEL - 1 FROM DUAL CONNECT BY LEVEL <= 2 UNION ALL
SELECT DATE '2020-03-01' + LEVEL - 1 FROM DUAL CONNECT BY LEVEL <= 4 UNION ALL
SELECT DATE '2020-04-01' + LEVEL - 1 FROM DUAL CONNECT BY LEVEL <= 1;

然后,您可以使用您的查询:

SELECT TO_CHAR(PURCHASEDATE, 'MM YYYY') AS monthyear,
       COUNT(*) AS frequency
FROM   PURCHASE
GROUP BY
       TO_CHAR(PURCHASEDATE, 'MM YYYY');

哪些输出:

月 |频率 :-------- | --------: 2020 年 3 月 | 4 01 2019 | 5 01 2020 | 3 2020 年 2 月 | 2 2019 年 2 月 | 3 2020 年 4 月 | 1

或者,您可以使用TRUNC

SELECT TRUNC(PURCHASEDATE,'MM') AS monthyear,
       COUNT(*) AS frequency
FROM   PURCHASE
GROUP BY
       TRUNC(PURCHASEDATE,'MM');

哪些输出:

月 |频率 :----------------- | --------: 2020-03-01 00:00:00 | 4 2020-04-01 00:00:00 | 1 2020-02-01 00:00:00 | 2 2020-01-01 00:00:00 | 3 2019-01-01 00:00:00 | 5 2019-02-01 00:00:00 | 3

或者,您可以使用EXTRACT

SELECT EXTRACT( YEAR FROM PURCHASEDATE) AS year,
       EXTRACT( MONTH FROM PURCHASEDATE) AS month,
       COUNT(*) AS frequency
FROM   PURCHASE
GROUP BY
       EXTRACT( YEAR FROM PURCHASEDATE),
       EXTRACT( MONTH FROM PURCHASEDATE);

哪些输出:

年份 |月 |频率 ---: | ----: | --------: 2019 | 1 | 5 2020 | 1 | 3 2020 | 2 | 2 2020 | 4 | 1 2019 | 2 | 3 2020 | 3 | 4

db小提琴here

【讨论】:

  • 重点是我使用的是 MONTHYEAR 别名,并按 PURCHASEDATE 订购...感谢您的详细回答
猜你喜欢
  • 2017-03-02
  • 2012-12-10
  • 1970-01-01
  • 1970-01-01
  • 2011-07-21
  • 2021-10-16
  • 1970-01-01
相关资源
最近更新 更多