球员转会SQL查询SUM计算异常及结果汇总方法咨询
一、为什么原查询会统计所有球员数据?
你的第一个查询里的子查询(SELECT SUM(WartoscRynkowa) - SUM(KwotaTransferu) FROM Beata.dane )是完全独立于外部查询的——它没有和外部的WHERE SzansaNaTransfer >= 1条件建立关联,所以不管外部筛选出哪些符合条件的球员,这个子查询都会计算整个Beata.dane表的所有球员的价值与转会费差额总和,自然得到了错误的130,而不是你期望的符合条件球员的总和33。
另外,你原查询里的WHERE SzansaNaTransfer >= 1和需求里的“出售转会概率≥2”也不一致,这点也需要修正。
二、修正查询:获取每位符合条件球员的信息、个人盈亏及总盈亏
要同时得到每位符合条件球员的信息、个人盈亏(单球员的市场价值减转会费),以及所有符合条件球员的总盈亏,最简洁的方式是用窗口函数SUM() OVER()——它能在保留每条球员记录的同时,直接计算出符合条件数据集的汇总值:
SELECT T.Imie, T.Nazwisko, T.NumerKoszulki, D.WartoscRynkowa, D.KwotaTransferu, D.SzansaNaTransfer, -- 计算单球员的个人盈亏 D.WartoscRynkowa - D.KwotaTransferu AS OsobistyZyskStrata, -- 计算所有符合条件球员的总盈亏(无分区的窗口函数会汇总当前筛选出的全部数据) SUM(D.WartoscRynkowa - D.KwotaTransferu) OVER() AS CalkowityZyskStrata FROM Beata.dane AS D JOIN Beata.team AS T ON D.NumerKoszulki = T.NumerKoszulki WHERE D.SzansaNaTransfer >= 2;
这个查询会输出:
- 所有
SzansaNaTransfer >= 2的球员的完整信息 - 每个球员自己的盈亏金额(
OsobistyZyskStrata列) - 在每一行都显示所有符合条件球员的总盈亏(
CalkowityZyskStrata列,值为你期望的33)
三、关于你更新后的查询的问题
你更新后的查询里的子查询(SELECT SUM(WartoscRynkowa) - SUM(KwotaTransferu) FROM Beata.dane NAD WHERE NAD.WartoscRynkowa = D.WartoscRynkowa )其实是在计算和当前球员市场价值相同的所有球员的盈亏总和,这应该不是你想要的结果。如果只是想得到单球员的盈亏,直接用D.WartoscRynkowa - D.KwotaTransferu即可,不需要嵌套子查询。
另一种实现方式:用CTE先筛选再计算
如果你不习惯窗口函数,也可以用公共表表达式(CTE)先筛选出符合条件的球员,再关联计算总盈亏:
WITH WybraneZawodnicy AS ( SELECT T.Imie, T.Nazwisko, D.WartoscRynkowa, D.KwotaTransferu, D.SzansaNaTransfer, D.WartoscRynkowa - D.KwotaTransferu AS OsobistyZyskStrata FROM Beata.dane AS D JOIN Beata.team AS T ON D.NumerKoszulki = T.NumerKoszulki WHERE D.SzansaNaTransfer >= 2 ) SELECT *, (SELECT SUM(OsobistyZyskStrata) FROM WybraneZawodnicy) AS CalkowityZyskStrata FROM WybraneZawodnicy;
这个写法和窗口函数的结果完全一致,只是实现逻辑不同。
内容的提问来源于stack exchange,提问作者Beti

