我是初学者(不是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添加到此子查询中,但没有添加任何效果。 这和我能够得到的一样接近。 许多其他尝试都给出了各种结果。
答案 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保留字。