2011-01-25 5 views
0

次のようなものがあるとします。グループBy: "missing"の値が含まれています

select 
    case 
    when fcompany = 'Acme' then 'Red' 
    when fcompany = 'Acme Rockets' then 'Blue' 
    else 'Green' 
    end 
    Color 
,sum(fann_sales) 
FROM 
    slcdpm 
group by 
    case 
    when fcompany = 'Acme' then 'Red' 
    when fcompany = 'Acme Rockets' then 'Blue' 
    else 'Green' 
    end 

多くの場合、2色しか表示されません。どのような3つの色をすべて引っ張って欠けている値の0を含めるための最良の方法は何ですか?

ユニオン?

答えて

2

はい、ユニオンオールがあなたの最善の策かもしれません。

SELECT 'red' AS Color, sum(fann_sales) FROM slcdpm WHERE fcompany = 'Acme' GROUP BY fcompany 
UNION ALL 
SELECT 'blue' AS Color, sum(fann_sales) FROM slcdpm WHERE fcompany = 'Acme Rockets' GROUP BY fcompany 
UNION ALL 
SELECT 'green' AS Color, sum(fann_sales) FROM slcdpm WHERE fcompany <> 'Acme' AND fcompany <> 'Acme Rockets' GROUP BY fcompany 
+1

これはO(3N)でスケールされますが... – gbn

0

このお試しください:すべての色が存在していなければならない場合、その理由列としてそれらを提示しませ

SELECT b.Color, 
       sum(fann_sales) 
FROM (
       SELECT case 
            when fcompany = 'Acme' then 'Red' 
            when fcompany = 'Acme Rockets' then 'Blue' 
            else 'Green' 
           end 
           Color, 
           fann_sales 
        FROM slcdpm 
      ) a RIGHT JOIN 
      (
       SELECT 'Red' AS Color 
       UNION ALL 
       SELECT 'Blue' AS Color 
       UNION ALL 
       SELECT 'Green' AS Color 
      ) b 
     ON a.Color = b.Color    
GROUP BY b.Color 
0

を?

SELECT 
    (SELECT sum(fann_sales) FROM slcdpm WHERE fcompany = 'Acme') AS RedSum, 
    (SELECT sum(fann_sales) FROM slcdpm WHERE fcompany = 'Acme Rockets') AS BlueSum, 
    (SELECT sum(fann_sales) FROM slcdpm WHERE fcompany <> 'Acme' AND fcompany <> 'Acme Rockets') AS GreenSum 

それ以外の場合は、@ JohnK813の回答にしてください。

2

GROUPをより多くの列を含む条件付きSUMに移動しますか?

select 
    sum(CASE WHEN fcompany = 'Acme' 
        THEN fann_sales ELSE 0 END) AS redsales, 
    sum(CASE WHEN fcompany = 'Acme Rockets' 
        THEN fann_sales ELSE 0 END) AS bluesales 
    sum(CASE WHEN fcompany NOT IN ('Acme Rockets', 'Acme') 
        THEN fann_sales ELSE 0 END) AS greensales 
FROM 
    slcdpm 

このためにテーブルを1回通過します。 UNION ALLまたはサブクエリのアプローチ(他の回答)は、節ごとに一度テーブルに触れますが、いくぶん遅くなります。

+0

+1のみ...単純なケースを使用しないのはなぜですか? :) –

+0

@Andriy M:あなたはシンプルなケースと検索されたケースを意味しますか?そうでない場合は、各色を正しくSUMにするには?はいの場合、INをきれいに表すことはできません。これは一貫しています。 – gbn

+0

はい、シンプルか検索します。あなたはINのことが正しいと思いますが、ELSEで置き換えるだけで心配する必要はありません。 –

関連する問題