Поворот стола с AVG внутри MAX (DECODE ()) - PullRequest
1 голос
/ 11 ноября 2010

Эй, ребята, мне нужна помощь с SQL ниже. Он продолжает давать мне один вывод для всех моих имен a.name:

 SELECT Drink.name,  
        MAX(DECODE(Size.type, 'Small', avg, NULL)) Small,
        MAX(DECODE(Size.type, 'Medium', avg, NULL)) Medium,
        MAX(DECODE(Size.type, 'Large', avg, NULL)) Large
 FROM Drink, Size (
             SELECT avg(Size.price) avg, Size.type, Drink.name FROM Drink, Size 
             GROUP BY Size.type, Drink.name )
 GROUP BY Drink.name
 ORDER BY Drink.name;

РЕЗУЛЬТАТ: Например, я буду использовать название бренда напитка с типом маленький, средний, большой. Я хочу получить среднее значение всех напитков в магазинах по всему городу.

Без использования пивота

Drink       |   Size    |   Price
Dr. Pepper  |   Small   |    1.00
Dr. Pepper  |  Medium   |    1.50
Dr. Pepper  |   Large   |    2.00

Использование pivot (желаемый вывод):

Drink         |  Small    |   Medium  | Large
Dr. Pepper    |   1.00    |   1.50    |  2.00
Mountain Dew  |   0.50    |   0.75     |  1.25

Вывод, который я получаю:

Drink         |  Small    |   Medium  | Large
Dr. Pepper    |   1.00    |   1.00    |  1.00
Mountain Dew  |   1.00    |   1.00    |  1.00

Ответы [ 2 ]

2 голосов
/ 11 ноября 2010

Использование (Oracle 9i +):

  SELECT x.name,
         MAX(CASE WHEN x.type = 'Small' THEN x.avg END) AS small,
         MAX(CASE WHEN x.type = 'Medium' THEN x.avg END) AS Medium,
         MAX(CASE WHEN x.type = 'Large' THEN x.avg END) AS Large
    FROM (SELECT d.name,
                 s.type, 
                 AVG(s.price) avg
            FROM DRINK d
            JOIN SIZE s ON s.size_id = d.size_id
        GROUP BY d.name, s.type) x
GROUP BY x.name

Ваша информация по-прежнему не соответствует критериям JOIN между таблицами DRINK и SIZE - я сделал предположения.Без критериев запрос просто производит декартово произведение - он никогда не даст ожидаемого результата.

Использование предложения WITH (Oracle 9i +):

WITH sample AS (
   SELECT d.name,
          s.type, 
          AVG(s.price) avg
     FROM DRINK d
     JOIN SIZE s ON s.size_id = d.size_id
 GROUP BY d.name, s.type)
  SELECT x.name,
         MAX(CASE WHEN x.type = 'Small' THEN x.avg END) AS small,
         MAX(CASE WHEN x.type = 'Medium' THEN x.avg END) AS Medium,
         MAX(CASE WHEN x.type = 'Large' THEN x.avg END) AS Large
    FROM sample x
GROUP BY x.name

PIVOT /UNPIVOT

Синтаксис ANSI не поддерживался в Oracle до 11g.

1 голос
/ 11 ноября 2010

Вот решение, которое сработало для меня - спасибо OMG Ponies за прояснение некоторых вещей.

SELECT x.NAME as "Drink", 
(MAX(DECODE(x.TYPE, 'Small', avg, NULL))) Small,
(MAX(DECODE(x."TYPE", 'Medium', avg, NULL))) Medium,
(MAX(DECODE(x."TYPE", 'Large', avg, NULL))) Large
FROM (
      SELECT Size."TYPE", Drink.NAME, Round(AVG(Size.price),2) avg 
      FROM Drink, Price 
      WHERE Drink.drink_id = Size.drink_id
      GROUP BY Size."TYPE", Drink.NAME) x
GROUP BY x.NAME
ORDER BY x.NAME;

Я все еще не уверен, почему JOIN дал мне результаты, которые он сделал; Я заменил, используя ГДЕ, и это сработало ... странно.

...