如何解决我可以将来自同一张表但具有不同过滤器的两个Select sum SQL查询联接在一起吗?
我遇到了一个问题,我试图将来自同一表但条件不同的两个SELECT和加到一个结果中。
代码如下:
DROP TABLE Match CASCADE CONSTRAINTS;
CREATE TABLE Match
(
Heim VARCHAR(50),Gast VARCHAR(50),HeimP NUMBER,GastP NUMBER
);
INSERT INTO Match
VALUES ('Bayern München','Borussia Dortmund',1,1);
INSERT INTO Match
VALUES ('Borussia Dortmund','Bayern München',3);
INSERT INTO Match
VALUES ('Bayern München','Schalke',3,0);
INSERT INTO Match
VALUES ('Schalke',3);
COMMIT;
SELECT SUM(HeimP) AS Heimpoints
FROM Match
WHERE Heim = 'Bayern München';
SELECT SUM(GastP) AS Gastpoints
FROM Match
WHERE Gast = 'Bayern München';
解决方法
执行此操作的一种方法是将where
子句中的条件替换为case
表达式中的条件,并仅求和相关行:
SELECT SUM(CASE heim WHEN 'Bayern München' THEN heimp END) AS Heimpoints,SUM(CASE gast WHEN 'Bayern München' THEN gastp END) AS Gastpoints
FROM match
WHERE 'Bayern München' IN (heim,gast) -- optimization to not query useless rows
,
您可以在CASE
内使用SUM()
表达式:
SELECT SUM(
CASE 'Bayern München'
WHEN Heim THEN HeimP
WHEN Gast THEN GastP
END
) AS points
FROM Match
WHERE 'Bayern München' IN (Gast,Heim);
请参见demo。
结果:
> | POINTS |
> | -----: |
> | 10 |
,
NUMBER
让我觉得您正在使用Oracle。那是一个支持横向联接的数据库(横向联接是标准SQL,但并非所有数据库都支持)。
像这样的事情可能是最简单的解决方案:
select sum(x.points)
from match m cross join lateral
(select m.heimp as team,m.heimp as points from dual union all
select m.gast,m.gastp from dual
) x
where x.team = 'Bayern München';
与其他解决方案相比,优点是仅引用特定团队一次(因此避免了错别字)。也许更重要的是,它很容易概括 所有团队:
select x.team sum(x.points)
from match m cross join lateral
(select m.heimp as team,m.gastp from dual
) x
group by x.team;
在不支持横向联接的数据库中,您可以使用union all
做类似的事情。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。