代码之家  ›  专栏  ›  技术社区  ›  J.G.A. Wijlhuizen

SQL的问题:合并JOIN、SUM和MAX

  •  0
  • J.G.A. Wijlhuizen  · 技术社区  · 4 年前

    数据库的构建方式如下: 聚会( PartyID 、姓名聚会、开始日期、数量宴会) 议员( 利迪德 ,姓名议员,委员会,政党,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:这段代码给了我一个与>=但我不明白为什么。

     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)
    
    1 回复  |  直到 4 年前
        1
  •  0
  •   Tim Biegeleisen    4 年前

    现在是学习解析函数的好时机。使用 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;
    

    请注意,这种方法非常简洁,而且对于两个或多个拥有最多选票的政党之间的联系也非常可靠。