2012-08-29 82 views
2

我是初学者(不是DBA)。 我的数据的简单版本==>我希望的结果:使用SUM,WHERE,GROUP_BY的MySQL子查询

|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 

为了得到第一个(好)结果:

 
|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这个子查询中不添加效果。 这是尽可能接近我已经能够得到。 许多其他尝试已经给出了各种结果。

回答

9

尝试组合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 
+0

哇,这工作....你是一位上帝......我花了几天在这个,知道stackoverflow只是坐在这里....谢谢你! –

2

我只是想提供以下,因为CASE是标准的SQL,如果未:

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 

另外,有 “数” 为列的名称是一个坏主意,因为它是一个SQL保留字。

+0

MySQL中的COUNT'不是[保留字](http://dev.mysql.com/doc/refman/5.6/en/reserved-words.html),但它是[聚合函数]的名称, (http://dev.mysql.com/doc/refman/5.6/en/group-by-functions.html#function_count)。 –

+0

@MarkByers。 。 。你是正确的,它不在MySQL保留字列表中。但是,COUNT是在我能找到的每个ANSI SQL保留字列表中的(我手边没有标准检查)。我仍然认为将这些词语用于变量名称是一个糟糕的主意。 –