[英]Mysql subquery for group and count records by specific field
我有這個問題:
我有一個car
表,每個car
記錄都有一個state
字段, state
字段值可以是:
1 = 啟用或2 = 禁用
例如,在這種情況下,我需要顯示的分組的所有汽車color
領域,並通過計算 color
,這不是真正的問題:)
這里是SQL語句:
SELECT
`id`,
`model_family`,
`color`,
COUNT(`color`) AS 'quantity',
`state`
FROM `auto`
WHERE `model_family` = 'Sedan'
GROUP BY `color`
+-----+--------------+------------+----------+---+
| id | model_family | color | quantity | state |
+-----+--------------+--------+----------+-------+
| 77 | Sedan | Red | 2 | 2 |
| 42 | Sedan | Blue | 3 | 2 |
| 97 | Sedan | Green | 5 | 1 |
+-----+--------------+--------+----------+-------+
結果顯示兩個已禁用記錄和一個已啟用記錄。
那么問題是:
我如何能顯示汽車禁用和啟用,但舉例來說,如果第一分組記錄,如果state
是禁用( state
= 2),那么quantity
字段將顯示為“0”(因為它不存在汽車啟用)其他quantity
= N
像這樣的東西:
+-----+--------------+------------+----------+-------+
| id | model_family | color | quantity | state |
+-----+--------------+------------+----------+-------+
| 77 | Sedan | Red | 0 | 2 |
| 42 | Sedan | Blue | 0 | 2 |
| 97 | Sedan | Green | 5 | 1 |
+-----+--------------+------------+----------+-------+
注冊!
SELECT
`id`,
`model_family`,
`color`,
SUM(CASE WHEN state = 1 THEN 1 ELSE 0 END) as enabled,
SUM(CASE WHEN state = 2 THEN 1 ELSE 0 END) as disabled,
`state`
FROM `auto`
WHERE `model_family` = 'Sedan'
GROUP BY `color`
您必須使用案例語句將項目組合在一起。 當它發現狀態為1時,你需要將所有這些記錄加在一起,這就是為什么我要做的然后1 Else 0。
這是如何做到的一個簡單示例。 我沒有測試過以確保它有效,但它應該。
如果要將所有禁用的組替換為0,則只需在select子句中放置一個case語句即可。 像這樣的東西:
SELECT id, model_family, color, (CASE WHEN state = 1 THEN COUNT(*) ELSE 0 END) AS quantity, state
FROM auto
WHERE model_family = 'Sedan'
GROUP BY color
ORDER BY id;
它在SQL Fiddle上的數據測試得很好。
編輯注意,由於您按顏色進行分組,因此您可以使用COUNT(*)而不是COUNT(顏色),因為它們將計算相同的內容。
編輯2同樣重要的是要注意,如果顏色有一些啟用的車輛和一些殘疾車輛,它仍然返回0,因為至少有一個禁用。 如果您想要計算已啟用的數量,您可以執行以下操作:
SELECT id, model_family, color, SUM(CASE WHEN state = 1 THEN 1 ELSE 0 END) AS quantityEnabled, state
FROM auto
WHERE model_family = 'Sedan'
GROUP BY color
ORDER BY id;
這個小提琴有兩個例子。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.