在一个TSQL语句中多次使用Count聚合函数

做报表的时候经常会用到聚合函数,有时候可能需要在一个查询里面写多个Count,只是Count的条件不一样。这种要怎么写呢?

我们可以用子查询来做这样的事:

SELECT 
Count_1=(SELECT Count(*) FROM Table1 WHERE Reference = 1), 
Count_2=(SELECT Count(*) FROM Table1 WHERE Reference = 2)

如果需要分组统计,上面语句就有心无力了,于是我们这样写:

示例数据:

Departments PK - DeptID DeptName

--------------------------

1 Department 1

2 Department 2

3 Department 3

4 Department 4

Groups PK - GroupdID DeptID

--------------------------

1 1

2 1

3 3

4 4

5 2

6 3

7 1

8 3

Inventory PK - ItemID GroupID

--------------------------

1 2

2 3

3 8

4 1

5 4

6 5

7 1

8 2

9 2

10 3

11 7

示例代码:

SELECT d.deptID,

    COUNT(DISTINCT g.GroupID) AS Groups,

    COUNT(DISTINCT i.ItemID) AS Items

FROM Departments d

    LEFT JOIN Groups g ON g.deptID = d.deptID

    LEFT JOIN Items i ON i.GroupID = g.GroupID

GROUP BY d.deptID

得到结果:

deptID  Groups  Items
-----   ------  -----
1       3       6 
2       1       1
3       3       3
4       1       1

也许你希望在Groups或Items里面没有记录则返回0,此时可以使用Left Outer Join。

在Left Outer Join里面写子查询也是可以的,我也经常这样用。实际上上面的查询如果还要在Count的同时进行过滤则需要用到子查询了。

SELECT d.deptID,

    g.COUNT1 AS Groups

FROM Departments d

    LEFT OUTER JOIN (SELECT deptID, COUNT(DISTINCT g.GroupID) AS COUNT1 FROM Groups WHERE GroupID > 2 GROUP BY DeptID

) as g on g.DeptID = d.DeptID


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值