SQL 的问题:组合 JOIN、SUM 和 MAX
Problem with SQL: combining a JOIN, SUM and MAX
我想构建一个查询,为我提供在其议员中获得最多选票的政党名称。
数据库的构建方式如下:
聚会(PartyID、NameParty、StartDate、AmountofSeats)
议员(LidID、NameCouncilor、Council、Party、AmountofVotes)
议员中的派对 = PartyID 派对中的派对。
我写了以下查询,但都无法为我提供正确的派对名称。 谁能帮帮我:我做错了什么?
这段代码给我取错了党名(这不是总票数最高的)。
SELECT s.NameParty, s.SumVotes
FROM (SELECT Party.NameParty, SUM(Councilors.AmountofVotes) SumVotes, Party.PartyID, Council.Party
FROM Councilors
JOIN Party on Party.PartyID = Councilors.Partij
GROUP BY Party.PartyID) s
WHERE s.SumVotes = (SELECT MAX(AmountofVotes)
FROM Councilors w1
WHERE w1.Party = s.PartyID);
尝试 2:此代码给我一个与 >= ALL 有关的错误,但我不明白为什么。
SELECT s.NameParty, s.SumVotes
FROM (SELECT Party.NameParty, SUM(Councilors.AmountofVotes) SumVotes, Party.PartyID, Councilors.Party
FROM Councilors
JOIN Partij on Party.PartyID = Councilors.Party
GROUP BY Party.PartyID) s
HAVING SUM(Councilors.AmountofVotes) >= ALL (
SELECT SUM(Councilors.AmountofVotes)
FROM Councilors
WHERE Councilors.Party = s.PartyID)
现在是学习解析函数的好时机。在此处使用 RANK()
:
WITH cte AS (
SELECT p.PartyId, p.NameParty, SUM(c.AmountofVotes) SumVotes,
RANK() OVER (ORDER BY SUM(c.AmountofVotes) DESC) rnk
FROM Party p
INNER JOIN Councilors c ON p.PartyID = c.Party
GROUP BY p.PartyID, p.NameParty
)
SELECT PartyId, NameParty, SumVotes
FROM cte
WHERE rnk = 1;
请注意,这种方法简洁明了,而且对于两个或多个得票最多的政党之间的联系可能性也很稳健。
我想构建一个查询,为我提供在其议员中获得最多选票的政党名称。
数据库的构建方式如下: 聚会(PartyID、NameParty、StartDate、AmountofSeats) 议员(LidID、NameCouncilor、Council、Party、AmountofVotes)
议员中的派对 = PartyID 派对中的派对。
我写了以下查询,但都无法为我提供正确的派对名称。 谁能帮帮我:我做错了什么?
这段代码给我取错了党名(这不是总票数最高的)。
SELECT s.NameParty, s.SumVotes
FROM (SELECT Party.NameParty, SUM(Councilors.AmountofVotes) SumVotes, Party.PartyID, Council.Party
FROM Councilors
JOIN Party on Party.PartyID = Councilors.Partij
GROUP BY Party.PartyID) s
WHERE s.SumVotes = (SELECT MAX(AmountofVotes)
FROM Councilors w1
WHERE w1.Party = s.PartyID);
尝试 2:此代码给我一个与 >= ALL 有关的错误,但我不明白为什么。
SELECT s.NameParty, s.SumVotes
FROM (SELECT Party.NameParty, SUM(Councilors.AmountofVotes) SumVotes, Party.PartyID, Councilors.Party
FROM Councilors
JOIN Partij on Party.PartyID = Councilors.Party
GROUP BY Party.PartyID) s
HAVING SUM(Councilors.AmountofVotes) >= ALL (
SELECT SUM(Councilors.AmountofVotes)
FROM Councilors
WHERE Councilors.Party = s.PartyID)
现在是学习解析函数的好时机。在此处使用 RANK()
:
WITH cte AS (
SELECT p.PartyId, p.NameParty, SUM(c.AmountofVotes) SumVotes,
RANK() OVER (ORDER BY SUM(c.AmountofVotes) DESC) rnk
FROM Party p
INNER JOIN Councilors c ON p.PartyID = c.Party
GROUP BY p.PartyID, p.NameParty
)
SELECT PartyId, NameParty, SumVotes
FROM cte
WHERE rnk = 1;
请注意,这种方法简洁明了,而且对于两个或多个得票最多的政党之间的联系可能性也很稳健。