【问题标题】:Mysql subquery for group and count records by specific fieldMysql子查询按特定字段对记录进行分组和计数
【发布时间】:2014-11-07 18:35:17
【问题描述】:

我有这个问题:

我有一个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),则对于第一个 grouped 记录 然后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 |
+-----+--------------+------------+----------+-------+

问候!

【问题讨论】:

  • 您能否提供一些带有您的表结构的示例数据集

标签: mysql count subquery


【解决方案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`

您必须使用 case 语句将项目组合在一起。当它发现状态为 1 时,您需要将所有这些记录相加,这就是为什么我要做 Then 1 Else 0。

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

【讨论】:

  • 这行得通,但它不符合 OP 的要求,您添加了一个额外的列。
  • 这确实有效,尽管我需要进行一些自定义。谢谢兄弟!
【解决方案2】:

如果您希望将所有禁用的组替换为 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(color),因为它们将计算相同的东西。

编辑 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 有两个例子。

【讨论】:

  • @joseluisq 只是为了我的好奇心——你用哪一个来满足你的需要?
  • 看起来不错。只是一个想法,为什么你有这么多重复的数据?
  • 这是正确的小提琴,可以在 SUM 上正常工作,而不是 COUNT(*) --> SQL Fiddle
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-05
  • 2019-12-31
  • 2015-11-16
相关资源
最近更新 更多