在我的表TblFinishByClass里有这条记录。一些ID没有参加Class,因此没有记录存在。只有3个类可用,分别是C、TP和TT。
ID Class Month Year Finished Total
ASAN014 C 04 2020 12 19
ASAN014 TP 04 2020 4 6
ASAN014 TT 04 2020 2 7
ASAN014 C 05 2020 10 18
ASAN014 TP 05 2020 1 2
ASAN014 TT 05 2020 2 6
ASAN015 C 04 2020 21 24
ASAN015 TP 04 2020 0 1
ASAN015 TT 04 2020 8 11
ASAN015 C 05 2020 14 19
ASAN015 TT 05 2020 4 5
正如前面提到的。如果ASAN015没有参加TT的类,那么FinishedTT和TotalTT的数据默认应该是0。我需要按ID、月、年进行分组,其中会有如下表格。
ID Month Year FinishedC TotalC FinishedTP TotalTP FinishedTT TotalTT
ASAN014 04 2020 12 19 4 6 2 7
ASAN014 05 2020 10 18 1 2 2 6
ASAN015 04 2020 21 24 0 1 8 11
ASAN015 05 2020 14 19 4 5 0 0
我的问题是,我们能不能在一个查询中完成这个任务?
你可以使用条件聚合。
SELECT
ID,
Month,
Year,
SUM(CASE WHEN Class = 'C' THEN Finished ELSE 0 END) AS FinishedC,
SUM(CASE WHEN Class = 'C' THEN Total ELSE 0 END) AS TotalC,
SUM(CASE WHEN Class = 'TT' THEN Finished ELSE 0 END) AS FinishedTT,
SUM(CASE WHEN Class = 'TT' THEN Total ELSE 0 END) AS TotalTT,
SUM(CASE WHEN Class = 'TP' THEN Finished ELSE 0 END) AS FinishedTP,
SUM(CASE WHEN Class = 'TP' THEN Total ELSE 0 END) AS TotalTP
FROM
TblFinishByClass
GROUP BY
ID,
Month,
Year;
结果。
+----+---------+-------+------+-----------+--------+------------+---------+------------+---------+
| | ID | Month | Year | FinishedC | TotalC | FinishedTT | TotalTT | FinishedTP | TotalTP |
+----+---------+-------+------+-----------+--------+------------+---------+------------+---------+
| 1 | ASAN014 | 4 | 2020 | 12 | 19 | 2 | 7 | 4 | 6 |
| 2 | ASAN014 | 5 | 2020 | 10 | 18 | 2 | 6 | 1 | 2 |
| 3 | ASAN015 | 4 | 2020 | 21 | 24 | 8 | 11 | 0 | 1 |
| 4 | ASAN015 | 5 | 2020 | 14 | 19 | 4 | 5 | 0 | 0 |
+----+---------+-------+------+-----------+--------+------------+---------+------------+---------+