簡體   English   中英

將多列中的行分組並計數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM