SQL查询问题:SUM()未按条件统计及结果汇总需求
解答你的SQL查询问题
问题1:为什么子查询统计了所有球员而非筛选后的?
你遇到的问题核心是子查询没有和外部查询的筛选条件关联。
你的初始查询里,子查询:
(SELECT SUM(WartoscRynkowa) -SUM(KwotaTransferu) FROM Beata.dane )
是一个完全独立的聚合查询,它不会受到外部查询中WHERE SzansaNaTransfer >= 1的影响——不管外部筛选出哪些符合条件的球员,这个子查询都会计算Beata.dane表中所有记录的市场价值总和减去转会金额总和,所以得到的是全表的盈亏差130,而非你需要的筛选后球员的总和33。
要解决这个问题,你可以把聚合逻辑和外部筛选结合起来,比如直接用窗口函数实现,或者让子查询应用相同的筛选条件:
-- 方案1:同时展示单球员数据、个人盈亏和总盈亏 SELECT D.*, T.Imie + ' ' + T.Nazwisko AS ImieNazwisko, D.WartoscRynkowa - D.KwotaTransferu AS SingleProfitLoss, -- 单球员盈亏 SUM(D.WartoscRynkowa - D.KwotaTransferu) OVER() AS TotalProfitLoss -- 总盈亏 FROM Beata.dane AS D JOIN Beata.team AS T ON D.NumerKoszulki = T.NumerKoszulki WHERE SzansaNaTransfer >= 1;
或者保持子查询形式,让它继承外部的筛选条件:
SELECT D.*, T.Imie + ' ' + T.Nazwisko AS ImieNazwisko, D.WartoscRynkowa - D.KwotaTransferu AS SingleProfitLoss, (SELECT SUM(WartoscRynkowa) - SUM(KwotaTransferu) FROM Beata.dane WHERE SzansaNaTransfer >= 1) AS TotalProfitLoss FROM Beata.dane AS D JOIN Beata.team AS T ON D.NumerKoszulki = T.NumerKoszulki WHERE SzansaNaTransfer >= 1;
问题2:如何在另一列汇总所有Result的总和?
首先要纠正你更新后的查询里的一个小问题:当前子查询(SELECT SUM(WartoscRynkowa) - SUM(KwotaTransferu) FROM Beata.dane NAD WHERE NAD.WartoscRynkowa = D.WartoscRynkowa )计算的是和当前球员市场价值相同的所有球员的盈亏总和,这并不是需求里的「单球员盈亏」。需求里的单球员盈亏应该是D.WartoscRynkowa - D.KwotaTransferu。
基于正确的单球员盈亏计算,要添加总盈亏列,最简洁的方式是使用窗口函数SUM() OVER(),它可以在不分组的情况下计算所有符合条件记录的总和:
SELECT T.Imie, T.Nazwisko, D.WartoscRynkowa - D.KwotaTransferu AS SingleProfitLoss, -- 单球员盈亏 SUM(D.WartoscRynkowa - D.KwotaTransferu) OVER() AS TotalProfitLoss -- 所有球员总盈亏 FROM Beata.dane AS D JOIN Beata.team AS T ON D.NumerKoszulki = T.NumerKoszulki WHERE SzansaNaTransfer >= 2;
如果你不想用窗口函数,也可以通过子查询预先计算总盈亏,再关联到主查询中:
WITH TotalCalc AS ( SELECT SUM(WartoscRynkowa - KwotaTransferu) AS TotalProfitLoss FROM Beata.dane WHERE SzansaNaTransfer >= 2 ) SELECT T.Imie, T.Nazwisko, D.WartoscRynkowa - D.KwotaTransferu AS SingleProfitLoss, TC.TotalProfitLoss FROM Beata.dane AS D JOIN Beata.team AS T ON D.NumerKoszulki = T.NumerKoszulki CROSS JOIN TotalCalc TC WHERE SzansaNaTransfer >= 2;
这样就能同时展示每位符合条件球员的个人盈亏,以及所有球员的总盈亏了。
内容的提问来源于stack exchange,提问作者Beti
相关产品推荐
相关产品推荐

