SQL查询 - 按季度排序是和否

时间:2017-10-08 12:59:17

标签: mysql sql count sql-order-by

我有以下表格:

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

现在我要总结yesno s并按季度排序(Q1Q2Q3,{{1 }}):

Q4

我的解决方案:

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

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

2 个答案:

答案 0 :(得分: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;

请注意,这包括年份。我解释" quarter"按年份区分。如果要组合多年的数据,请删除该组件。

MySQL将布尔值视为数字上下文中的整数,使用" 1"为真和" 0"为假。

答案 1 :(得分:1)

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

...
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