#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
.