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

时间:2016-04-13 15:13:30

标签: mysql sum subquery

我有两个方面得分(Zdobyte)和失球(Stracone)的总和(作为主持人(GoleGosp)和作为嘉宾(GoleGosc))的问题。我做错了什么?

为了获得HOST的目标,我使用

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);

1 个答案:

答案 0 :(得分:0)

我认为这就是你想要的:

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个表,然后我们使用LEFT JOIN将它们组合在一个表中并对您想要的值求和。

此查询提供了不同的结果,但我不确定哪些查询包含错误(由于我不完全理解数据,因此无法进行任何计数。

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

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)