mysql - Sql - 分组表
问题描述
这是我的查询;
SELECT Name, MAX(A) AS A, MAX(B) AS B
FROM (
SELECT l.Name, SUM(A.Count) AS A, 0 AS B
FROM List l
LEFT JOIN A ON A.Name = l.Name
GROUP BY l.Name
UNION ALL
SELECT l.Name, 0 AS A, SUM(B.Count)AS B
FROM List l
LEFT JOIN B ON B.Name = l.Name
GROUP BY l.Name) sub
GROUP BY Name
ORDER BY Name
我的表格和查询结果在这里:https ://www.db-fiddle.com/f/rdKLkyaeEsi8bPcNPkUnTE/11
我需要在 C.createDate(ex;2017-2018-2019) 上将 Table-A 与 Table-C 分组
每年 -> 添加列
表 A 中的 C_ID -> 表 C 中的 ID
2017 -> 编号:3,5
2018 -> 编号:2,6,8
2019 -> 编号:1,4,7
示例:对于产品 1(仅表 A 值)
2017 -> 13 ; 2018 -> 23+11 = 34;2019 -> 5 ; B -> 8+10=18(2018 年为 8,2017 年为 10,但年份对表 B 不重要)
例如,我的目标结果;
Name | 2017 | 2018 | 2019 | B
---------+--------+--------+--------+------
Product1 | 13 | 34 | 5 | 18
Product2 | 21 | 0 | 3 | 0
Product3 | 13 | 0 | 7 | 15
Product4 | 18 | 27 | 0 | 29
Product5 | 0 | 8 | 25 | 32
Product6 | 0 | 0 | 0 | 0
Product7 | 22 | 14 | 0 | 0
Product8 | 0 | 26 | 4 | 23
Product9 | 0 | 11 | 0 | 0
解决方案
我推荐与 Thorsten Kettner 回答相同的方式。但我认为你必须使用CASE
和总和A.COUNT
。您可以使用YEAR()
从日期中提取年份,然后SUM
使用case
相应年份的语句。
SELECT List.NAME,IFNULL(MYAC.2017,0) AS '2017', IFNULL(MYAC.2018,0) AS '2018', IFNULL(MYAC.2019,0) AS '2019',IFNULL(BSUM.TOTAL,0) as B
FROM
(
SELECT
A.NAME,
SUM(case when YEAR(C.CREATEDATE) = 2017 then A.Count else 0 end) as '2017',
SUM(case when YEAR(C.CREATEDATE) = 2018 then A.Count else 0 end) AS '2018',
SUM(case when YEAR(C.CREATEDATE) = 2019 then A.Count else 0 end) AS '2019'
FROM A
LEFT JOIN C ON C.ID = A.C_ID
GROUP BY A.NAME
) MYAC
LEFT JOIN
(
SELECT NAME,SUM(B.COUNT) AS TOTAL
FROM B
GROUP BY NAME
) BSUM ON BSUM.NAME = MYAC.NAME
RIGHT JOIN
List on List.Name = MYAC.NAME
ORDER BY List.NAME;
更新您可以使用LEFT JOIN
下面的答案也RIGHT JOIN
经常影响可读性。
SELECT List.Name,IFNULL(MYABC.2017,0) AS '2017', IFNULL(MYABC.2018,0) AS '2018', IFNULL(MYABC.2019,0) AS '2019',IFNULL(MYABC.B,0) as B from List
LEFT JOIN (
SELECT MYAC.Name,MYAC.2017 AS '2017', MYAC.2018 AS '2018', MYAC.2019 AS '2019',BSUM.TOTAL as B
FROM
(
SELECT
A.NAME,
SUM(case when YEAR(C.CREATEDATE) = 2017 then A.Count else 0 end) as '2017',
SUM(case when YEAR(C.CREATEDATE) = 2018 then A.Count else 0 end) AS '2018',
SUM(case when YEAR(C.CREATEDATE) = 2019 then A.Count else 0 end) AS '2019'
FROM A
LEFT JOIN C ON C.ID = A.C_ID
GROUP BY A.NAME
) MYAC
LEFT JOIN
(
SELECT NAME,SUM(B.COUNT) AS TOTAL
FROM B
GROUP BY NAME
) BSUM ON BSUM.NAME = MYAC.NAME ) MYABC
on List.name = MYABC.name
ORDER BY List.NAME;
推荐阅读
- c# - 无法从 Microsoft Access 在 DataGridView 上显示图像
- python - Google Cloud SDK 在 macOS Catalina 上发出警告:Executing a script that is loading libcrypto in an unsafe way
- c# - 无法在 Visual Studio 2019 中运行任何 .NET Core Web 应用程序
- erp - Infor syteline 8.3,如何在向IDO添加表格时删除强制指示符?
- amazon-web-services - 如何让 Cloudformation 提供更详细的调试输出?
- c# - 如何在 WPF 中创建一个看起来像“UWP”应用程序的顶级窗口?
- server - 导入后应用程序服务器证书不起作用
- spring-boot - Maven 为 SpringBoot REST 控制器生成 OpenAPI JSON
- windows - 我是否需要分别为每个 opengl 上下文加载函数?
- r - 如何启动 RStudio 以指向 Windows 上的非默认 R 版本