【问题标题】:How can I group the number of values into columns based on month in sql如何在sql中根据月份将值的数量分组到列中
【发布时间】:2020-06-02 02:20:21
【问题描述】:

我有一个像

这样的数据集
Code Date 
123  21-Jan-2000 
234  23-Feb-1999 
123  19-Jan-2001

我想查询表格以显示如下数据:

Code Total (All months) Jan Feb ... Dec 
123    2                 1   1
234    1                 0   1

我真的不知道如何开始。非常感谢任何提示或帮助。

【问题讨论】:

    标签: oracle-sqldeveloper


    【解决方案1】:

    我们可以尝试透视查询:

    SELECT
        Code,
        COUNT(Date) AS "Total (All months)",
        COUNT(CASE WHEN EXTRACT(MONTH FROM Date) = 1  THEN 1 END) AS Jan,
        COUNT(CASE WHEN EXTRACT(MONTH FROM Date) = 2  THEN 1 END) AS Feb,
        COUNT(CASE WHEN EXTRACT(MONTH FROM Date) = 3  THEN 1 END) AS Mar,
        COUNT(CASE WHEN EXTRACT(MONTH FROM Date) = 4  THEN 1 END) AS Apr,
        COUNT(CASE WHEN EXTRACT(MONTH FROM Date) = 5  THEN 1 END) AS May,
        COUNT(CASE WHEN EXTRACT(MONTH FROM Date) = 6  THEN 1 END) AS Jun,
        COUNT(CASE WHEN EXTRACT(MONTH FROM Date) = 7  THEN 1 END) AS Jul,
        COUNT(CASE WHEN EXTRACT(MONTH FROM Date) = 8  THEN 1 END) AS Aug,
        COUNT(CASE WHEN EXTRACT(MONTH FROM Date) = 9  THEN 1 END) AS Sep,
        COUNT(CASE WHEN EXTRACT(MONTH FROM Date) = 10 THEN 1 END) AS Oct,
        COUNT(CASE WHEN EXTRACT(MONTH FROM Date) = 11 THEN 1 END) AS Nov,
        COUNT(CASE WHEN EXTRACT(MONTH FROM Date) = 12 THEN 1 END) AS Dec
    FROM yourTable
    GROUP BY
        Code
    ORDER BY
        Code;
    

    请注意,上述显式枢轴语法通常可以胜过使用PIVOT 运算符的对应语法。

    【讨论】:

    • 如果所有月份都有 0 个值,是否有办法将总数显示为 0,因为它现在显示为 1
    • @llamaro25 尝试计算Date 列。仅当给定代码具有一条或多条其DateNULL 的记录时,才可能出现总计为零。检查更新的答案。
    【解决方案2】:

    您想使用PIVOT。来自official documentation

    select * from (
       select times_purchased, state_code
       from customers t
    )
    pivot 
    (
       count(state_code)
       for state_code in ('NY','CT','NJ','FL','MO')
    )
    order by times_purchased
    

    所以在你的情况下,以下查询:

    select * from (
        select code, datepart(month, date) as month
          from #data
    ) as data
    pivot 
    (
        count(code)
         for month in ('1','2','3','4','5','6','7','8','9','10','11','12')
    )
    

    【讨论】:

      猜你喜欢
      • 2020-12-03
      • 2022-12-05
      • 2020-12-31
      • 2022-07-07
      • 2016-10-10
      • 2018-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多