在乙個TSQL語句中多次使用Count聚合函式

2021-06-01 21:31:48 字數 2324 閱讀 8698

做報表的時候經常會用到聚合函式,有時候可能需要在乙個查詢裡面寫多個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 > 2group by deptid

) as g on g.deptid = d.deptid

在同乙個sql語句中寫不同條件的Count數量

其實有count很難實現 可以用sum 去實現它 例子如下 select xy,sum case when jw cljgh 1 then 1 else 0 end as 留級,sum case when jw cljgh 2 then 1 else 0 end as 復學 from xjgl,bj...

乙個關於累加工資的T SQL語句

今天在itpub看到乙個人問的語句問題 問題如下 table emp parent id emp id emp name total amout null 2 andrew 200 2 1 nancy 100 2 3 janet 120 3 4 michael 80 1 5 robert 50 每個...

在同乙個sql語句中,統計不同條件的Count數量

前幾天幫同事優化了個sql,原寫法使用多個子查詢這裡不再重現了,大家都遇到過這樣一種情況,在專案後期的維護中,修改別人的sql 超過30行的語句,多層子查詢,讀起來很坑,時間久的專案伴隨著人員的流通,你可能就不知道原作者寫這一堆的sql是幹什麼用的,當然碰到部分有注釋習慣的朋友還是好點的,過長的sq...