MySQL pivot: отображать значения в одной строке [дубликаты]

0

С приведенной ниже таблицей:

CREATE TABLE 'STOCK_LEVEL'(
  'ID' int(11),
  'Date' date,
  'ProductCode' varchar(50),
  'Quantity' int(10)
)

INSERT INTO 'STOCK_LEVEL' ('ID', 'Date', 'ProductCode', 'Quantity') VALUES
(1, '2018-02-10', 'PROD01', 15),
(2, '2018-02-10', 'PROD02', 90),
(3, '2018-02-14', 'PROD03', 5),
(4, '2018-02-14', 'PROD01', 11);

Я хотел бы видеть уровень запасов для данного продукта в определенный день, поэтому я создал запрос по продукту:

SELECT 
    Date,
    (Case when ProductCode = 'PROD01' then Quantity else 0 end) As 'AlphaProduct', 
    (Case when ProductCode = 'PROD02' then Quantity else 0 end) As 'BetaProduct', 
    (Case when ProductCode = 'PROD03' then Quantity else 0 end) As 'GammaProduct'

FROM STOCK_LEVEL

WHERE Date IN( '2018-02-10', '2018-02-14')

Который даст мне такой результат:

+------------+--------------+-------------+--------------+
| Date       | AlphaProduct | BetaProduct | GammaProduct |
+------------+--------------+-------------+--------------+
| 2018-02-10 | 15           | 0           | 0            |
+------------+--------------+-------------+--------------+
| 2018-02-10 | 0            | 90          | 0            |
+------------+--------------+-------------+--------------+
| 2018-02-14 | 0            | 0           | 5            |
+------------+--------------+-------------+--------------+
| 2018-02-14 | 11           | 0           | 0            |
+------------+--------------+-------------+--------------+

Я, вероятно, пропустил что-то основное, но есть ли способ сгруппировать по дате следующим образом: (Я не могу GROUP BY, поскольку нет агрегата?)

+------------+--------------+-------------+--------------+
| Date       | AlphaProduct | BetaProduct | GammaProduct |
+------------+--------------+-------------+--------------+
| 2018-02-10 | 15           | 90          | 0            |
+------------+--------------+-------------+--------------+
| 2018-02-14 | 11           | 0           | 5            |
+------------+--------------+-------------+--------------+
  • 1
    Вам нужно использовать MAX(Case when ProductCode = '[]' then Quantity else 0 end) '[]' и GROUP BY date
  • 0
    @ raymond-nijland, то есть, если вы не намеревались использовать подзапрос
Показать ещё 6 комментариев
Теги:
pivot

1 ответ

3
Лучший ответ

Используйте функцию aa (fake) aggreation и группу

SELECT 
Date,
max(Case when ProductCode = 'PROD01' then Quantity else 0 end) As 'AlphaProduct', 
max(Case when ProductCode = 'PROD02' then Quantity else 0 end) As 'BetaProduct', 
max(Case when ProductCode = 'PROD03' then Quantity else 0 end) As 'GammaProduct'

FROM STOCK_LEVEL

WHERE Date IN( '2018-02-10', '2018-02-14')
group by Date
  • 0
    Я начинаю задумываться: почему люди используют CASE вместо функции IF() ?
  • 0
    Я предпочитаю дело, потому что я более мощный. и более легким для понимания .. но в этом случае для ОП более уверенно с знакомым кодом
Показать ещё 10 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню