使用GROUP BY和DISTINCT的MySQL条件SUM

用户名

我的foos表中具有以下数据结构:

-----------------------------------------------
| id | bar_id | baz_id | date       | value   |
-----------------------------------------------
| 1  | 1      | 1      | 2013-12-01 | failure |
| 2  | 1      | 1      | 2013-12-09 | failure |
| 3  | 2      | 1      | 2013-12-02 | success |
| 4  | 3      | 1      | 2013-12-10 | success |
| 5  | 3      | 1      | 2013-12-01 | failure |
| 6  | 3      | 1      | 2013-12-08 | success |
| 7  | 1      | 2      | 2013-12-02 | success |
| 8  | 1      | 2      | 2013-12-08 | failure |
| 9  | 1      | 2      | 2013-12-03 | success |
| 10 | 2      | 2      | 2013-12-07 | failure |
| 11 | 2      | 2      | 2013-12-08 | failure |
| 12 | 3      | 2      | 2013-12-04 | success |
| 13 | 3      | 3      | 2013-12-14 | failure |
-----------------------------------------------

我的目标是针对不同的baz_id获得每个bar_id的成功/总数。例如:

------------------------------
| bar_id | successes | total |
------------------------------
| 1      | 1         | 2     |
| 2      | 1         | 2     |
| 3      | 2         | 3     |
------------------------------

这是一个有效的查询:

SELECT foos.bar_id,
    successes,
    COUNT(distinct baz_id) as total
  FROM foos
    LEFT JOIN 
        (SELECT bar_id, count(distinct baz_id) as successes
          FROM foos
          WHERE value = "success"
          GROUP BY bar_id) as other
      ON foos.bar_id = other.bar_id
  GROUP BY bar_id

有没有一种方法可以使用MySQL函数获取成功列而不进行子选择?似乎必须要有一种使用方法GROUP_CONCAT或其他“按功能分组”来执行此操作。

编辑

使用SUM(value="success")接近,但是计算唯一的baz_id的所有成功,而不是仅计算一次成功:

SELECT bar_id,
    SUM(value="success") AS successes,
    COUNT(distinct baz_id) as total
  FROM foos   
  GROUP BY bar_id

------------------------------
| bar_id | successes | total |
------------------------------
| 1      | 2         | 2     | <- Successes should be 1
| 2      | 1         | 2     |
| 3      | 3         | 3     | <- Successes should be 2
------------------------------
约阿希姆·伊萨克森(Joachim Isaksson)

您可以使用CASEwithDISTINCT来获得相同的结果;

SELECT bar_id, 
  COUNT(DISTINCT CASE WHEN value='success' THEN baz_id ELSE NULL END) successes, 
  COUNT(DISTINCT baz_id) total
FROM foos
GROUP BY bar_id;

要使用进行测试的SQLfiddle

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

MySQL查询-如何获取具有GROUP BY和WHERE条件的SUM并使用LEFT OUTER JOIN?

来自分类Dev

在MySQL中一起使用Distinct,Count和Group

来自分类Dev

MySQL-使用GROUP BY和SUM将两列相乘

来自分类Dev

`使用SUM和GROUP BY将mySQL查询转换为SQLite

来自分类Dev

MySQL GROUP BY和SUM排名

来自分类Dev

如何在MySQL中使用GROUP BY和条件进行计数

来自分类Dev

使用SQL Server进行DISTINCT和GROUP BY

来自分类Dev

SUM和GROUP BY使用子查询

来自分类Dev

使用Pandas Group By和.sum()获得%利率

来自分类Dev

SUM和GROUP BY使用子查询

来自分类Dev

使用 group by 和 sum 的 SQL 联合

来自分类Dev

MySQL Sum total 使用 Group By 多列

来自分类Dev

使用 sum 和 group by 条件将 SQL 查询转换为 linq/lambda 表达式

来自分类Dev

使用 GROUP BY 和聚合条件删除

来自分类Dev

使用UNION和GROUP BY的AS

来自分类Dev

来自AS列的MySQL SUM和GROUP BY

来自分类Dev

MYSQL复杂GROUP BY和SUM查询失败

来自分类Dev

MySQL:当count = sum和group by时选择

来自分类Dev

MySQL使用Sum和Case

来自分类Dev

使用R到COUNT()和GROUP_CONCAT(DISTINCT x)

来自分类Dev

如何使用Linq Group By和Distinct进行Treeview

来自分类Dev

如何使用MySQL子查询和GROUP BY

来自分类Dev

MySQL GROUP BY和ORDER BY使用特定的单词

来自分类Dev

在mysql中使用join和group by子句

来自分类Dev

MySQL如何使用GROUP BY和BETWEEN?

来自分类Dev

如何同时使用MYSQL Group By和Order By

来自分类Dev

在同一查询中使用SUM和DISTINCT

来自分类Dev

使用distinct()和models.Sum()时的Django错误

来自分类Dev

SQL Server-基于条件的SUM()和Group()记录