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<代码>右连接
影响可读性。我将用
左连接更新答案
。谢谢你指出:)