将不存在或不存在的数据规范化为单一SQL查询。

问题描述 投票:0回答:1

在我的表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

我的问题是,我们能不能在一个查询中完成这个任务?

mysql sql normalization
1个回答
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 |
+----+---------+-------+------+-----------+--------+------------+---------+------------+---------+
© www.soinside.com 2019 - 2024. All rights reserved.