SQL-запрос для поворота столбца с использованием CASE WHEN

#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 . Или с несколькими строками с одинаковым значением.