6

私は初心者です (DBA ではありません)。私のデータの単純なバージョン ==> 私の期待する結果:

|ボール |色|カウント| |ボール |トータルブルー|トータルレッド|
------------------- --------------------------------
|b1 |赤 | 2 | ====> |b1 | 5 | 2 |  
|b1 |青 | 3 | |b2 | 3 | 1 |  
|b1 |青 | 2 |           
|b2 |赤 | 1 |             
|b2 |青 | 3 |     

各ボール (b1、b2 など) を集計したい。次に、各ボールの各色の合計インスタンス。各ボールの色ごとに複数のエントリがあります (私の実世界のデータ)。しかし、ここでは青い #1 ボールのみの複数のエントリを示しています。

私はこれを簡単に行うことができます:

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 に答える