首页 > 解决方案 > SQL Server:使用聚合运算符 COUNT() 打印左表中的所有行

问题描述

我正在尝试编写一个查询,该查询返回TotalPlayers每个得分少于 10 分的球队的计数[LowScoringPlayers],如果一个球队中的所有球员得分超过 10 分,我仍然需要为该球队打印TeamName0 和 0 。[LowScoringPlayers]

我的下面的查询给了我正确的计数,但是如果球队中没有球员得分少于 10 分,那么它会跳过打印TeamName

SELECT DISTCINT
    (TM.[TeamId]), TM.[TeamName], 
    COUNT(DISTINCT S.[PlayerId]) AS [LowScoringPlayers]
FROM 
    dbo.[Teams] TM
INNER JOIN 
    dbo.[Player] PL ON PL.[PlayerId] = TM.[TeamId]
INNER JOIN 
    dbo.[ScoreAudit] S ON S.[PlayerId] = PL.[PlayerId] AND S.[Runs] <= 10
GROUP BY 
    TM.[TeamId], TM.[TeamName]

如果我删除条件S.[Runs] <=10,查询会打印所有团队名称。我能想到的一种方法是在之前使用 case 语句S.[Runs] <=10,但数据量很大,因此可能存在性能问题。

还有其他更好的方法吗?

标签: sql-servertsqlleft-joinaggregate-functions

解决方案


LEFT JOIN在您的查询中使用。因此,解决方案可以是:

SELECT DISTINCT TM.TeamId, TM.TeamName, COUNT(DISTINCT S.PlayerId) AS LowScoringPlayers
FROM dbo.Teams TM
     LEFT JOIN dbo.Player PL
        ON PL.PlayerId = TM.TeamId
     LEFT JOIN dbo.ScoreAudit S
        ON S.PlayerId = PL.PlayerId AND S.Runs <=10
    GROUP BY TM.TeamId, TM.TeamName

推荐阅读