使用SUM,WHERE,GROUP_BY的MySQL子查询

Pau*_*ada 5 mysql group-by sum subquery where

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

|ball |color|count|         |ball |Total Blue|Total Red| 
-------------------         ----------------------------
|b1   |red  |   2 |  ====>  |b1   | 5       | 2        |  
|b1   |blue |   3 |         |b2   | 3       | 1        |  
|b1   |blue |   2 |           
|b2   |red  |   1 |             
|b2   |blue |   3 |     

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

我可以轻松地做到这一点:

SELECT ball, 
SUM(count) AS 'Total Blue'
FROM t1
WHERE color = 'blue'
GROUP BY ball
Run Code Online (Sandbox Code Playgroud)

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

|ball |Total Blue| 
 -----------------
|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
Run Code Online (Sandbox Code Playgroud)

我明白了:

|ball |Total Blue| Total Red|
 ---------------------------
|b1   | 5        |  3       |
|b2   | 3        |  3       |

总红色显示所有红球的总数,无论球数如何.

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

(SELECT SUM(cc) FROM 
(SELECT DISTINCT count AS cc FROM t1  WHERE color = 'red') AS dd )
AS 'Total Red'
Run Code Online (Sandbox Code Playgroud)

我已将GROUP BY添加到此子查询中,但没有添加任何效果.这和我能够得到的一样接近.许多其他尝试都给出了各种结果.

Mar*_*ers 15

尝试结合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
Run Code Online (Sandbox Code Playgroud)


Gor*_*off 5

我只想提供以下内容,因为 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
Run Code Online (Sandbox Code Playgroud)

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