Как преобразовать строку в столбец

#sql #oracle

#sql #Oracle

Вопрос:

У меня возникла некоторая проблема с преобразованием строки в столбец. Исходная таблица выглядит следующим образом

   Date     CD      C1      C2    Amount  
2019-01    FEE     Y       N       100
2019-01    FEE     Y       Y       200
2019-01    REV     Y       N       300
2019-02    FEE     Y       N       100
2019-02    REV     N       N       100
  

Я хочу получить следующую таблицу

  Date     C1    C2   FEE      REV     Total
2019-01   Y     N    100      300      400
2019-01   Y     Y    200      null     200
2019-02   Y     N    100      null     100
2019-02   N     N    null     100      100
  

Я попытался использовать функцию decode (), например

 select Date, C1, C2,
       decode(cd,'FEE', Amount) FEE,
       decode(cd,'REV', Amount) REV
from table group by.........
  

Он получит результат

  Date     C1    C2   FEE      REV     
2019-01   Y     N    100      null
2019-01   Y     N    null     300
2019-01   Y     Y    200      null 
  

Я хочу поместить данные в одну строку, если у них одинаковая дата, C1 и C2.
Как написать запрос об этом? Любая помощь? Спасибо!

Комментарии:

1. Если Date, C1 и C2 являются частью предложения group by, вы должны получить ожидаемый результат.

2. Являются ли FEE и REV единственно возможными значениями в столбце CD?

Ответ №1:

Вам нужна агрегация. Я бы рекомендовал case для условной части:

 select Date, C1, C2,
       sum(case when cd = 'FEE' then Amount end) as FEE,
       sum(case when cd = 'REV' then Amount end) as REV,
       sum(Amount) as TOTAL
from table
group by Date, C1, C2;
  

Комментарии:

1. Записи по-прежнему находятся в разных строках, если у них одинаковая дата, c1 и c2

2. @HenlenLee . . . Тогда три столбца не идентичны. У вас могут быть пробелы вокруг строковых значений или date может быть компонент времени. Это не может привести к созданию разных строк, если значения идентичны из-за group by .