sql-server - SQL Server:使用聚合运算符 COUNT() 打印左表中的所有行
问题描述
我正在尝试编写一个查询,该查询返回TotalPlayers
每个得分少于 10 分的球队的计数[LowScoringPlayers]
,如果一个球队中的所有球员得分超过 10 分,我仍然需要为该球队打印TeamName
0 和 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
,但数据量很大,因此可能存在性能问题。
还有其他更好的方法吗?
解决方案
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
推荐阅读
- azure-ad-b2c - Azure B2C 自定义重置密码策略
- python - Django 管理侧边栏错误
- amazon-web-services - 无法在 AWS Lambda 中使用 OpenCV-Python
- node.js - 如何从命令行使用节点模块?
- css - 如何保持视频和课程菜单的高度相同
- javascript - 允许使用一个或多个连续大写字母和数字的 PascalCased 的正则表达式
- node.js - 如何在没有外部依赖项的情况下以编程方式重新启动 Node.js 应用程序?
- unity3d - UnityEditor.EditorApplication' 不包含“ExitPlaymode”的定义
- entity-framework-core - 使用 ef 核心代码首先迁移防止“更新数据库”
- git - 如何在 git 上同步部分或全部项目存储?