Group By but include “missing” values

前端 未结 4 2048
醉梦人生
醉梦人生 2021-01-25 15:13

Suppose I have the following.

select
  case
    when fcompany = \'Acme\' then \'Red\'
    when fcompany = \'Acme Rockets\' then \'Blue\'
    else \'Green\'
  en         


        
相关标签:
4条回答
  • 2021-01-25 15:40

    Try this:

    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 讨论(0)
  • 2021-01-25 15:47

    If all colors must be present, why not present them as columns?

    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
    

    Otherwise, just go with @JohnK813 answer.

    0 讨论(0)
  • 2021-01-25 15:48

    Move the GROUP into a conditional SUM with more columns?

    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
    

    One pass over the table for this. A UNION ALL or subquery approach (in other answers) will touch the table once per clause = somewhat slower.

    0 讨论(0)
  • 2021-01-25 15:51

    Yes, Union All may be your best bet.

    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
    
    0 讨论(0)
提交回复
热议问题