簡體   English   中英

用於特定字段的組和計數記錄的Mysql子查詢

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

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