You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:59:13