MySQL:countif和Group By
我有以下mysql表测试结果MySQL:countif和Group By,mysql,Mysql,我有以下mysql表测试结果 | ID | Test_ID | Device_OS| Status | Date | | 1 | 1 | Android | passed | 2015/10 | | 2 | 1 | Android | failed | 2015/10 | | 3 | 15 | iOS | passed | 2015/11 | | 4 | 20 | Android | passed | 2015/11 |
| ID | Test_ID | Device_OS| Status | Date |
| 1 | 1 | Android | passed | 2015/10 |
| 2 | 1 | Android | failed | 2015/10 |
| 3 | 15 | iOS | passed | 2015/11 |
| 4 | 20 | Android | passed | 2015/11 |
| 5 | 27 | Android | passed | 2015/11 |
| 6 | 10 | iOS | failed | 2015/12 |
| 7 | 5 | Android | passed | 2015/12 |
我需要按月计算每个操作系统和组的唯一测试ID的数量。
我编写了一个查询,计算唯一测试的一般数量:
SELECT Run_Date, COUNT(DISTINCT Test_ID) FROM Test_Results
GROUP BY MONTH(Run_Date)
ORDER BY Run_Date DESC;
但我想不出如何突破Deivce_OS。
结果会是这样的:
Run_Date COUNT Android iOS
12/10/2015 3650 3650 2500
11/5/2015 1909 1909 1900
10/1/2015 1667 1667 1325
SELECT YEAR(Run_Date), MONTH(Run_Date), COUNT(DISTINCT Test_ID),
SUM(Device_OS = 'Android') as Android, SUM(Device_OS = 'iOS') as iOS
FROM Test_Results
GROUP BY YEAR(Run_Date), MONTH(RUn_Date)
ORDER BY YEAR(Run_Date) DESC, MONTH(RUn_Date) DESC;
谢谢大家! 首先,你不应该在没有年份的情况下按月分组——除非你真的、真的打算这样做。其次,您应该养成只使用
选择组中的表达式的习惯
第三,我认为您只需要条件聚合,如下所示:
Run_Date COUNT Android iOS
12/10/2015 3650 3650 2500
11/5/2015 1909 1909 1900
10/1/2015 1667 1667 1325
SELECT YEAR(Run_Date), MONTH(Run_Date), COUNT(DISTINCT Test_ID),
SUM(Device_OS = 'Android') as Android, SUM(Device_OS = 'iOS') as iOS
FROM Test_Results
GROUP BY YEAR(Run_Date), MONTH(RUn_Date)
ORDER BY YEAR(Run_Date) DESC, MONTH(RUn_Date) DESC;
编辑:
我注意到您希望每个月对操作系统进行唯一的测试。为此,请有条件地使用COUNT(DISTINCT)
:
SELECT YEAR(Run_Date), MONTH(Run_Date), COUNT(DISTINCT Test_ID),
COUNT(DISTINCT CASE WHEN Device_OS = 'Android' THEN Test_ID END) as Android,
COUNT(DISTINCT CASE WHEN Device_OS = 'iOS' THEN Test_ID END) as iOS
FROM Test_Results
GROUP BY YEAR(Run_Date), MONTH(RUn_Date)
ORDER BY YEAR(Run_Date) DESC, MONTH(RUn_Date) DESC;
谢谢你的解释!