【问题标题】:MySQL Subquery using SUM, WHERE, GROUP_BY使用 SUM、WHERE、GROUP_BY 的 MySQL 子查询
【发布时间】:2012-08-29 00:11:32
【问题描述】:

我是初学者(不是 DBA)。 我的数据的简单版本 ==> 我希望的结果:

|球|颜色|计数| |球 |总蓝|总红|
-------------------- ----------------------------
|b1 |红色 | 2 | ====> |b1 | 5 | 2 |
|b1 |蓝色 | 3 | |b2 | 3 | 1 |
|b1 |蓝色 | 2 |
|b2 |红色 | 1 |
|b2 |蓝色 | 3 | 

我想将每个球(b1、b2 等)制成表格。 然后是每个球的每种颜色的总实例。 每个球的每种颜色都有多个条目(在我的真实世界数据中)。 但这里我只显示蓝色#1-balls 的多个条目。

我可以轻松做到这一点:

SELECT ball, 
SUM(count) AS 'Total Blue'
FROM t1
WHERE color = 'blue'
GROUP BY ball

要获得第一个(好的)结果:

|球 |总蓝| ----------------- |b1 | 5 | |b2 | 3 |

为了更进一步,我想我需要一个子查询。 但我无法让子查询以与常规查询相同的方式处理。

以下是迄今为止我得到的最接近的结果(简单尝试):

SELECT ball, 
SUM(count) AS 'Total Blue',
(SELECT SUM(count) FROM t1 WHERE color = 'red') AS 'Total Red'
FROM t1 
WHERE color = 'blue'
GROUP BY ball

我明白了:

|球|总蓝|总红|
 --------------------------
|b1 | 5 | 3 |
|b2 | 3 | 3 |

Total Red 显示所有红球的总数,与球数无关。

这个更复杂的子查询(红色)产生完全相同的结果:

(SELECT SUM(cc) FROM 
(SELECT DISTINCT count AS cc FROM t1  WHERE color = 'red') AS dd )
AS 'Total Red'

我已将 GROUP BY 添加到此子查询中,但没有添加任何效果。 这是我所能得到的最接近的。 许多其他尝试已经给出了不同的结果。

【问题讨论】:

    标签: mysql group-by subquery sum where


    【解决方案1】:

    尝试结合 SUM 和 IF:

     SELECT
        ball, 
        SUM(IF(color = 'blue', count, 0)) AS 'Total Blue'
        SUM(IF(color = 'red', count, 0)) AS 'Total Red'
     FROM t1
     GROUP BY ball
    

    【讨论】:

    • 哇,好用……你真是神……我花了好几天的时间,知道 stackoverflow 只是坐在这里……谢谢!
    【解决方案2】:

    我只想提供以下内容,因为 CASE 是标准 SQL 而 IF 不是:

    select ball,
           sum(case when color = 'blue' then `count` else 0 end) as TotalBlue,
           sum(case when color = 'red' then `count` else 0 end) as TotalRed
    from t
    group by ball
    order by 1
    

    另外,将“count”作为列名是个坏主意,因为它是 SQL 保留字。

    【讨论】:

    • COUNT 不是 MySQL 中的 reserved word,而是 aggregate function 的名称。
    • @MarkByers 。 . .您是正确的,它不在 MySQL 保留字列表中。然而,COUNT 在我能找到的每一个 ANSI SQL 保留字列表中(我手头没有要检查的标准)。我仍然认为在变量名中使用这样的词是个坏主意。
    猜你喜欢
    • 2015-10-30
    • 1970-01-01
    • 1970-01-01
    • 2018-12-26
    • 2015-02-18
    • 2015-09-17
    • 1970-01-01
    • 1970-01-01
    • 2015-11-03
    相关资源
    最近更新 更多