В противном случае просто ответьте @ JohnK813.

оложим, у меня есть следующее.

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 для отсутствующего значения?

Союз всех?

Ответы на вопрос(4)

почему бы не представить их в виде столбцов?

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.

Переместить ГРУППУ в условную сумму с большим количеством столбцов?

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 или подзапрос (в других ответах) будет касаться таблицы один раз за предложение = несколько медленнее.

 Andriy M28 янв. 2011 г., 09:31
+1, только ... почему бы не использовать простой CASE? :)
 Andriy M28 янв. 2011 г., 09:55
Да, просто против поиска. Вы правы в отношении IN, но вам не нужно беспокоиться об этом, так как вы просто замените его на ELSE.
 gbn28 янв. 2011 г., 09:47
@ Андрей М: ты имеешь в виду простое против разыскиваемого дела? Если нет, чтобы правильно суммировать каждый цвет? Если да, IN не может быть представлен чисто, и это соответствует

Да, 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
 gbn25 янв. 2011 г., 22:11
Это масштабируется в O (3N), хотя ...

Попробуй это:

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

Ваш ответ на вопрос