MySQL 来自具有不同 GROUP BY 的多列的 SUM

MySQL SUM from multiple columns with different GROUP BY

我在获取作为东道主 (GoleGosp) 和作为客座 (GoleGosc) 的双方每支球队的进球总数 (Zdobyte) 和失球总数 (Stracone) 的总和时遇到问题。我做错了什么?

作为我使用的主机获取目标总和

SELECT CONCAT(Nazwa,' ',Miasto) AS Klub, SUM(GoleGosp) AS Zdobyte,SUM(GoleGosc) AS Stracone FROM mecze JOIN kluby ON mecze.IdGosp=kluby.IdKlub WHERE (IdGosp BETWEEN 1 AND 16) AND IdGosp<>IdGosc GROUP BY CONCAT(Nazwa,' ',Miasto);

我作为 GUEST 使用的目标总和

 SELECT CONCAT(Nazwa,' ',Miasto) AS Klub, SUM(GoleGosc) AS Zdobyte,SUM(GoleGosp) AS Stracone FROM mecze JOIN kluby ON mecze.IdGosc=kluby.IdKlub WHERE (IdGosc BETWEEN 1 AND 16) AND IdGosc<>IdGosp GROUP BY CONCAT(Nazwa,' ',Miasto);

我不知道如何将这两个查询作为一个查询求和。

这个不行

SELECT DISTINCT ZdobyteGOSP,StraconeGOSP,ZdobyteGOSC,StraconeGOSC FROM

(SELECT CONCAT(Nazwa,' ',Miasto) AS Klub, SUM(GoleGosp) AS ZdobyteGOSP,SUM(GoleGosc) AS StraconeGOSP FROM mecze JOIN kluby ON mecze.IdGosp=kluby.IdKlub WHERE (IdGosp BETWEEN 1 AND 16) AND IdGosp<>IdGosc GROUP BY CONCAT(Nazwa,' ',Miasto)) as p1,
(SELECT CONCAT(Nazwa,' ',Miasto) AS Klub, SUM(GoleGosc) AS ZdobyteGOSC,SUM(GoleGosp) AS StraconeGOSC FROM mecze JOIN kluby ON mecze.IdGosc=kluby.IdKlub WHERE (IdGosc BETWEEN 1 AND 16) AND IdGosc<>IdGosp GROUP BY CONCAT(Nazwa,' ',Miasto)) as p2;

.

'CREATE TABLE `mecze` (
  `IdGosp` int(11) DEFAULT NULL,
  `IdGosc` int(11) DEFAULT NULL,
  `Datameczu` date DEFAULT NULL,
  `GoleGosp` int(11) DEFAULT NULL,
  `GoleGosc` int(11) DEFAULT NULL,
  `IleWidzow` int(11) DEFAULT NULL,
  KEY `IdGosp` (`IdGosp`),
  KEY `IdGosc` (`IdGosc`),
  CONSTRAINT `mecze_ibfk_2` FOREIGN KEY (`IdGosc`) REFERENCES `kluby` (`IdKlub`),
  CONSTRAINT `mecze_ibfk_1` FOREIGN KEY (`IdGosp`) REFERENCES `kluby` (`IdKlub`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8'
'CREATE TABLE `kluby` (
  `IdKlub` int(11) NOT NULL DEFAULT ''0'',
  `Nazwa` varchar(40) DEFAULT NULL,
  `Miasto` varchar(30) DEFAULT NULL,
  `RokZal` varchar(4) DEFAULT NULL,
  PRIMARY KEY (`IdKlub`)


) ENGINE=InnoDB DEFAULT CHARSET=utf8'

插入

INSERT INTO kluby (IdKlub,Nazwa,Miasto,RokZal) VALUES
(1,'Wisla','Krakow',1933),
(2,'Slask','Wroclaw',1947),
(3,'Legia','Warszawa',1945),
(4,'Lech','Poznan',1950),
(5,'Stomil','Olsztyn',1962),
(6,'Lechia','Gdansk',1949),
(7,'Rokita','Brzeg Dolny',1951),
(8,'Izolator','Boguchwala',1955),
(9,'LKS','Lodz',1946),
(10,'Gornik','Zabrze',1948),
(11,'Groclin','Grodzisk',1977),
(12,'Wisla','Plock',1932),
(13,'Cracovia','Krakow', 1925),
(14,'Korona','Kielce',1933),
(15,'Jagiellonia','Bialystok',1954),
(16,'Unia','Raciborz',1950);

INSERT INTO mecze (IdGosp,IdGosc,Datameczu,GoleGosp,GoleGosc,IleWidzow) values
(10,14,'2009-01-25',2,2,9830),
(11,14,'2009-02-01',2,2,1876),
(12,14,'2009-02-08',5,1,8670),
(13,14,'2009-02-15',5,3,16969),
(14,14,'2009-02-22',2,5,7688),
(15,1,'2008-10-05',1,2,1222),
(16,2,'2008-10-05',3,0,1899),
(15,3,'2008-10-15',2,1,1333),
(16,4,'2008-10-15',0,5,722),
(5,15,'2008-10-22',1,1,2113),
(6,16,'2008-10-22',1,1,522),
(4,10,'2008-12-28',3,5,6521),
(5,10,'2009-01-04',4,5,6077),
(6,10,'2009-01-11',3,3,10385),
(7,10,'2009-01-18',2,5,8254),
(8,10,'2009-01-25',5,4,9821),
(9,10,'2009-02-01',5,2,3256),
(1,1,'2008-10-04',3,3,5559),
(2,1,'2008-10-05',4,5,7565),
(3,1,'2008-10-12',1,4,8910),
(4,1,'2008-10-19',3,5,1208),
(5,1,'2008-10-26',2,1,6577);

我想这就是你想要的:

SELECT T1.Klub, T1.Zdobyte+IFNULL(T2.Zdobyte,0) AS Zdobyte, T1.Stracone+IFNULL(T2.Stracone,0) AS Stracone
FROM (SELECT idKlub,
        CONCAT(Nazwa,' ',Miasto) AS Klub, 
        SUM(GoleGosp) AS Zdobyte,
        SUM(GoleGosc) AS Stracone 
        FROM mecze 
        JOIN kluby ON mecze.IdGosp=kluby.IdKlub 
        WHERE (IdGosp BETWEEN 1 AND 16) 
        AND IdGosp<>IdGosc GROUP BY CONCAT(Nazwa,' ',Miasto)) AS T1
LEFT JOIN ( SELECT idKlub,
                CONCAT(Nazwa,' ',Miasto) AS Klub, 
                SUM(GoleGosc) AS Zdobyte,
                SUM(GoleGosp) AS Stracone 
                FROM mecze 
                JOIN kluby ON mecze.IdGosc=kluby.IdKlub 
                WHERE (IdGosc BETWEEN 1 AND 16) 
                AND IdGosc<>IdGosp GROUP BY CONCAT(Nazwa,' ',Miasto)) AS T2 ON T2.idKlub = T1.idKlub

我们使用您的两个查询来设置 2 个 table,然后我们使用 LEFT JOIN 将它们合并为一个 table 并对您想要的值求和。

这个查询给出了不同的结果,但我不确定哪个查询包含错误(因为我不完全理解数据,所以没有做任何统计。

编辑:我很确定这最后一个查询现在是正确的,但请通过手动计数来检查!您的原始查询没有显示一个俱乐部,因为它被加入语句遗漏了!

SELECT  CONCAT(Nazwa,' ',Miasto) AS Klub,
        SUM(GoleGosp) AS Zdobyte,
        SUM(GoleGosc) AS Stracone
FROM (SELECT Nazwa, Miasto, SUM(GoleGosp) AS GoleGosp, SUM(GoleGosc) AS GoleGosc
        FROM kluby 
        JOIN mecze ON mecze.IdGosp=kluby.IdKlub AND mecze.IdGosp BETWEEN 1 AND 16 AND mecze.IdGosp != mecze.IdGosc
        GROUP BY CONCAT(Nazwa,' ',Miasto)
        UNION
        SELECT Nazwa, Miasto, SUM(GoleGosc) AS GoleGosp, SUM(GoleGosp) AS GoleGosc
        FROM kluby 
        JOIN mecze ON mecze.IdGosc=kluby.IdKlub AND mecze.IdGosc BETWEEN 1 AND 16 AND mecze.IdGosp != mecze.IdGosc
        GROUP BY CONCAT(Nazwa,' ',Miasto)) AS T1
GROUP BY CONCAT(Nazwa,' ',Miasto)