2011-01-25 118 views
0

假设我有以下几点。分组依据但包含“缺失”值

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 

比方说,它通常只返回两种颜色。拉出所有三种颜色的最佳方法是什么,并将缺失值包含0?

Union All?

回答

2

是的,Union All可能是你最好的选择。

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 2011-01-25 21:11:46

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 

为此通过了一次。 UNION ALL或子查询方法(在其他答案中)将每个子句触碰一次表格=稍慢。

+0

+1,仅...为什么不使用简单的CASE? :) – 2011-01-28 08:31:10