6

我是初学者(不是 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 添加到此子查询中,但没有增加效果。这是我所能得到的最接近的。许多其他尝试已经给出了各种各样的结果。

4

2 回答 2

18

尝试结合 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
于 2012-08-29T00:14:56.563 回答
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

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

于 2012-08-29T01:11:07.297 回答