用于特定字段的组和计数记录的Mysql子查询

时间:2014-11-07 18:35:18

标签: mysql count subquery

我有这个问题:

我有一个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 |
+-----+--------------+------------+----------+-------+

注册!

2 个答案:

答案 0 :(得分:2)

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.

这是如何做到的一个简单示例。我没有经过测试以确保它有效,但它应该。

答案 1 :(得分:1)

如果要将所有禁用的组替换为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;

这个fiddle有两个例子。