#sql #pivot
#sql #поворот
Вопрос:
У меня есть следующая таблица:
Bank:
name val amount
John 1 2000
Peter 1 1999
Peter 2 1854
John 2 1888
Я пытаюсь написать SQL-запрос, который выдаст следующий результат:
name amountVal1 amountVal2
John 2000 1888
Peter 1999 1854
Пока у меня есть это:
SELECT name,
CASE WHEN val = 1 THEN amount ELSE 0 END AS amountVal1,
CASE WHEN val = 2 THEN amount ELSE 0 END AS amountVal2
FROM bank
Однако это дает немного неправильный результат:
name amountVal1 amountVal2
John 2000 0
Peter 1999 0
John 0 1888
Peter 0 1854
Как я могу изменить свой запрос, чтобы обеспечить правильное представление?
Спасибо
Ответ №1:
SELECT
name,
SUM(CASE WHEN val = 1 THEN amount ELSE 0 END) AS amountVal1,
SUM(CASE WHEN val = 2 THEN amount ELSE 0 END) AS amountVal2
FROM bank GROUP BY name
Комментарии:
1. Это сделало свое дело. Я попытался использовать Group by без SUM, и это не сработало. Теперь я вижу, что у вас могло быть одно и то же имя со многими разными значениями в столбцах amountVal1 / 2. Поэтому я предполагаю, что
group by name
не знал бы, что делать с числами. В этом случае нам нужно указать ему СУММИРОВАТЬ их! Спасибо за помощь
Ответ №2:
Похоже, вам нужно объединить таблицу саму по себе. Попробуйте это:
select bank1.name, bank1.amount, bank2.amount
from bank bank1
inner join bank bank2 on
bank1.name = bank2.name
and bank1.val = 1
and bank2.val = 2
Комментарии:
1. Спасибо, я думаю, это тоже сработало бы, но я не хочу создавать временную таблицу, если это возможно.
2. @Roger: Это не приведет к созданию какой-либо временной таблицы. В некоторых случаях это может быть даже быстрее, чем
GROUP BY - CASE
подход.3. Но это покажет разные результаты, если есть люди со строками только для
val=1
илиval=2
. Или с несколькими строками с одинаковым значением.