[英]Group rows in multiple columns and count
我有一個包含這些數據的表格:
SELECT typeId, status FROM geo WHERE userId = 1 LIMIT 5;
+--------+--------+
| typeId | status |
+--------+--------+
| 2 | 2 |
| 2 | 5 |
| 8 | 2 |
| 3 | 3 |
| 2 | 5 |
+--------+--------+
我想計算每個 typeID 的不同狀態的數量。 這里的預期結果:
status 2 = active
status 3 = disabled
status 5 = archived
+--------+--------+----------+----------+
| typeId | active | disabled | archived |
+--------+--------+----------+----------+
| 2 | 1 | 0 | 2 |
| 8 | 1 | 0 | 0 |
| 3 | 0 | 1 | 0 |
+--------+--------+----------+----------+
0 can be is NULL, not a problem
我嘗試過這樣的查詢:“SELECT typeId,CASE WHEN status = 2 THEN status END AS active,CASE WHEN status = 3 THEN status END AS disabled, CASE WHEN status = 5 THEN status END AS archived FROM geo
WHERE userId
= 1 group by typeId”但當然這不是預期的結果..我得到了狀態,而不是計數,我不知道如何計算它們。
謝謝你的幫助!
你需要聚合函數:
SELECT typeId, SUM( status = 2 ) AS active, SUM( status = 3 ) AS disabled, SUM( status = 5 ) AS archived
FROM geo
WHERE userId = 1
GROUP BY typeId;
請注意,這使用了一個方便的 MySQL 快捷方式,該快捷方式將布爾值“如同”它們是整數, 1
表示真, 0
表示假。
如何嘗試這種方式(對於 T-SQL):
SELECT typeId,
SUM(CASE status WHEN '2' THEN 1 ELSE 0 END) AS 'active',
SUM(CASE status WHEN '3' THEN 1 ELSE 0 END) AS 'disabled',
SUM(CASE status WHEN '5' THEN 1 ELSE 0 END) AS 'archived'
FROM geo
WHERE userId = 1
GROUP BY typeID
您可以將 case 表達式與 count 函數一起使用:
SELECT typeId,
COUNT(CASE status WHEN '2' THEN 1 END) AS 'active',
COUNT(CASE status WHEN '3' THEN 1 END) AS 'disabled',
COUNT(CASE status WHEN '5' THEN 1 END) AS 'archived'
FROM Table1
GROUP BY typeID;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.