Mysql Sql分组表
这是我的疑问Mysql Sql分组表,mysql,sql,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
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
我的表格和查询结果如下:
我需要在C.createDate(2017-2018-2019)将表A与表C分组
每年->添加列
表A中的C_ID->表C中的ID
2017->ID:3,5
2018->ID:2,6,8
2019->ID: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
我推荐与托尔斯滕·凯特纳答案相同的方法。但我认为你必须使用
大小写和A.COUNT之和。您可以使用YEAR()
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;
更新您可以将答案与下面的左连接
一起使用,因为右连接
通常会影响可读性
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;
我推荐与Thorsten Kettner答案相同的方法。但我认为你必须使用大小写和A.COUNT之和。您可以使用YEAR()
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;
更新您可以将答案与下面的左连接
一起使用,因为右连接
通常会影响可读性
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;
以下是我对你的问题的看法。要获得答案,请搜索[YourDB]
,并将其更改为您数据库的名称。
在回答中,首先执行左连接,以从表C中获取年份
。之后,对视图T进行汇总,并创建T1视图。汇总后,在T1视图上执行旋转,以获得以年份为列的PIV视图。最后,执行与表B的联接以获得列B的和
-- Need to bring the information from PIV and B
SELECT [PIV].[Name], "2017", "2018", "2019", [B].[Count_B]
FROM
(
-- This subquery takes the output from view T to create a summarization on both the product and year.
SELECT [T].[Name], SUM([T].[Count]) AS My_Sum, [T].[My_year]
FROM
(
--This subquery creates the view T which brings only the year from table C. The year is important to have for the final output to create the columns.
SELECT [Name]
,[Count]
,[C_ID]
,YEAR([YourDB].[dbo].[C].[createDate]) as My_year
FROM [YourDB].[dbo].[A]
LEFT JOIN [YourDB].[dbo].[C]
ON [C_ID]=ID) AS T
GROUP BY [T].[Name], [T].[My_year]) AS T1
PIVOT
(
MAX([T1].My_Sum)
FOR My_year IN ("2017", "2018", "2019")
)PIV
LEFT JOIN (
SELECT [Name],SUM([Count]) AS Count_B
FROM [YourDB].[dbo].[B]
GROUP BY [Name])B
ON [PIV].[Name] = [B].[Name]
这是我对你的问题的看法。要获得答案,请搜索[YourDB]
,并将其更改为您数据库的名称。
在回答中,首先执行左连接,以从表C中获取年份
。之后,对视图T进行汇总,并创建T1视图。汇总后,在T1视图上执行旋转,以获得以年份为列的PIV视图。最后,执行与表B的联接以获得列B的和
-- Need to bring the information from PIV and B
SELECT [PIV].[Name], "2017", "2018", "2019", [B].[Count_B]
FROM
(
-- This subquery takes the output from view T to create a summarization on both the product and year.
SELECT [T].[Name], SUM([T].[Count]) AS My_Sum, [T].[My_year]
FROM
(
--This subquery creates the view T which brings only the year from table C. The year is important to have for the final output to create the columns.
SELECT [Name]
,[Count]
,[C_ID]
,YEAR([YourDB].[dbo].[C].[createDate]) as My_year
FROM [YourDB].[dbo].[A]
LEFT JOIN [YourDB].[dbo].[C]
ON [C_ID]=ID) AS T
GROUP BY [T].[Name], [T].[My_year]) AS T1
PIVOT
(
MAX([T1].My_Sum)
FOR My_year IN ("2017", "2018", "2019")
)PIV
LEFT JOIN (
SELECT [Name],SUM([Count]) AS Count_B
FROM [YourDB].[dbo].[B]
GROUP BY [Name])B
ON [PIV].[Name] = [B].[Name]
Product6不在结果中。@HasanKaanTURAN,我又添加了一个带有列表的join,以获得您期望的结果。请检查更新的答案啊,这些数字是计数字段的总和。我错过了。好的。然而,我永远不会正确的外部连接,因为我经常发现正确的连接很难阅读。只需从列表中选择并左键连接两个子查询。@ThorstenKettner,True<代码>右连接
影响可读性。我将用左连接更新答案
。感谢您指出:)Product6不在结果中。@HasanKaanTURAN,我又添加了一个与List
的连接,以获得您期望的结果。请检查更新的答案啊,这些数字是计数字段的总和。我错过了。好的。然而,我永远不会正确的外部连接,因为我经常发现正确的连接很难阅读。只需从列表中选择并左键连接两个子查询。@ThorstenKettner,True<代码>右连接
影响可读性。我将用左连接更新答案
。谢谢你指出:)