我有这个问题:
我有一个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 |
+-----+--------------+------------+----------+-------+
注册!
答案 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有两个例子。