【问题标题】:SQL query - order yes and no by quarterSQL 查询 - 按季度排序是和否
【发布时间】:2017-10-08 12:59:17
【问题描述】:

我有下表:

id|overtime| date
--+--------+-----------
1 | yes    | 2017-03-10
2 | no     | 2017-07-16
3 | yes    | 2017-01-22
4 | no     | 2017-07-14

现在我想将yess 和nos 相加并按季度排序(Q1,Q2,Q3,Q4):

yes| no| quarter
---+---+---------------
13 |  4| Q1
2  |  5| Q2
8  | 14| Q3
12 | 12| Q4

我的解决方案:

SELECT 
    (select count(*) As sum_yes from dashboard where overtime = 'Yes' ) as yes,
    (select count(*) As sum_no from dashboard where overtime = 'No' ) as no, 
    (SELECT quarter(date) as quarter from dashboard) 
group by quarter

我知道它不起作用。很高兴得到一些帮助。

【问题讨论】:

    标签: mysql sql count sql-order-by


    【解决方案1】:

    使用条件聚合:

    select year(date) as yyyy, quarter(date) as q,
           sum(overtime = 'Yes') as yes,
           sum(overtime = 'No') as no
    from dashboard
    group by yyyy, q;
    

    请注意,这包括年份。我将“季度”解释为按年份区分。如果您想合并多年的数据,请移除该组件。

    MySQL 将布尔值视为数字上下文中的整数,“1”表示真,“0”表示假。

    【讨论】:

      【解决方案2】:

      所以你想要每季度一行...

      ...
      FROM dashboard
      GROUP BY quarter(date);
      

      然后你想得到一列,其中包含overtime = 'Yes'

      SELECT
        COUNT(CASE WHEN overtime = 'Yes' THEN 1 END) as yes,
        ...
      

      再买一张

        ...
        COUNT(CASE WHEN overtime = 'No' THEN 1 END) as yes,
        ...
      

      就是这样。 case 表达式将匹配的行映射到 1,而将非映射行映射到 null(由于隐含的 else null 子句)。

      只需添加四分之一列即可。

      有关此技术的更多信息: http://modern-sql.com/use-case/pivot

      【讨论】:

      • 谢谢马库斯!它工作正常!这是我的查询: SELECT COUNT(CASE WHEN overtime = 'Yes' THEN 1 END) as Ja, COUNT(CASE WHEN overtime = 'No' THEN 1 END) as Nein, Quarter(date) as Quartal FROM dashboard GROUP BY Quartal
      猜你喜欢
      • 2021-03-30
      • 2011-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-14
      • 1970-01-01
      • 2021-08-13
      • 1970-01-01
      相关资源
      最近更新 更多