sqlserver怎么实现同一个表中多个count查询并且分组并且统计总数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sqlserver怎么实现同一个表中多个count查询并且分组并且统计总数相关的知识,希望对你有一定的参考价值。

参考技术A declare @t table (hm varchar(10),fy int)
insert @t values ('23456',12)
insert @t values ('56423',13)
insert @t values ('56321',15)
insert @t values ('89546',25)
insert @t values ('78965',85)
insert @t values ('56789',88)

select bj,count(fy) as sl,sum(fy) as hj from (
select *,substring(cast(fy as varchar(10)),1,1) as bj
from @t) a
group by bj

SQL Server:使用聚合运算符 COUNT() 打印左表中的所有行

【中文标题】SQL Server:使用聚合运算符 COUNT() 打印左表中的所有行【英文标题】:SQL Server : printing all the rows from left table while using aggregate operator COUNT() 【发布时间】:2021-03-22 22:57:11 【问题描述】:

我正在尝试编写一个查询,返回每个得分少于 10 分的球队中的 TotalPlayers 计数为 [LowScoringPlayers],如果球队中的所有球员得分超过 10 分,我仍然需要打印TeamName 和 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] &lt;=10,查询将打印所有团队名称。我能想到的一种方法是在S.[Runs] &lt;=10 之前使用case 语句,但数据量很大,因此可能存在性能问题。

还有其他更好的方法吗?

【问题讨论】:

【参考方案1】:

在您的查询中使用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

【讨论】:

以上是关于sqlserver怎么实现同一个表中多个count查询并且分组并且统计总数的主要内容,如果未能解决你的问题,请参考以下文章

sqlserver 怎么将一个字段中61,62逗号隔开的的多个数据转变成另一张表中一个字段对应的多个数据

组合 COUNT 查询 [重复]

从 Hive 中的多个表中选择 count(*)

怎么把sqlserver一个表中的数据导入到oracle中???

sql server怎么把多个查询结果关联起来

SQL Server:使用聚合运算符 COUNT() 打印左表中的所有行