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

时间:2012-08-29 00:11:33

标签: mysql group-by subquery sum 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-balls的多个条目。

我可以很容易地做到这一点:

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

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

|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

我明白了:

|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'

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

2 个答案:

答案 0 :(得分:13)

尝试合并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

答案 1 :(得分:3)

我只想提供以下内容,因为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保留字。