2014-11-17 5 views
1

У меня возникли проблемы с созданием сложного запроса PL SQL.Комплексный запрос Pivot в Oracle

Это таблица - SQL Fiddle

ColumnA ColumnB ColumnC ColumnD ColumnE 
A Simple1 Para  Red  121 
A Simple1 Para  Blue 122 
B Simple2 Para  Red  123 
B Simple2 Para  Blue 124 
C Simple3 Para  Red  125 
C Simple3 Para  Blue 126 
D Simple4 Para  Red  127 
D Simple4 Para2 Blue 128 
D Simple4 Para3 Green 129 

И я ожидаю выход, как это.

ColumnA ColumnB ColumnC Red Blue Green 
A Simple1  Para 121 122  Null 
B Simple2  Para 123 124  Null 
C Simple3  Para 125 126  Null 
D Simple4  Para 127 128  129 
D Simple4  Para2 127 128  129 
D Simple4  Para3 127 128  129 
+1

Какая у вас проблема - что вы пробовали? Вы действительно имеете в виду PL/SQL, или просто Oracle-flavor SQL? –

+0

Я имею в виду PL/SQL ... – user2281858

+0

Так где же ваш выход появляется? Вы ищете функцию, которая возвращает курсор? Показать контекст, который вы будете называть этим, может помочь. В вашей Fiddle нет PL/SQL или любого запрошенного кода. Также может быть полезно узнать, какую версию Oracle вы используете. –

ответ

4

Предполагая, что я понять ваши требования, учитывая ваши желаемые результаты, вы хотите сгруппировать красные, синие и зеленые столбцы columna и columnb, не включая columnc в группировке.

Для создания pivot вы можете использовать max и case. Тогда вы можете join эти результаты обратно в исходную таблицу, используя первые 2 колонки и distinct:

SELECT DISTINCT 
     t1.columna, 
     t1.columnb, 
     t1.columnc, 
     t2.red, 
     t2.blue, 
     t2.green 
FROM Table1 t1 
    JOIN (
     SELECT 
      ColumnA, 
      ColumnB, 
      max(case when columnd = 'Red' then columne end) red, 
      max(case when columnd = 'Blue' then columne end) blue, 
      max(case when columnd = 'Green' then columne end) green 
     FROM Table1 
     GROUP BY columna, columnb 
    ) t2 ON t1.columna = t2.columna AND t1.columnb = t2.columnb 
ORDER BY t1.columna, t1.columnb, t1.columnc 
+0

Я думаю, что ваше решение также решает проблему, так что +1 – Aramillo

+0

+1 ... выглядит идеально, попробовав его с различными сценариями. – user2281858

4

Вы также можете использовать точку опоры, с аналитическими функциями:

select columna,columnb,columnc,max(red) over (partition by columna,columnb), 
max(green) over (partition by columna,columnb), 
max(blue) over (partition by columna,columnb) 
from (
select * from t pivot (max(columne) for columnd in ('Red' as red,'Green' as green, 
'Blue' as blue))) 
order by 1,2,3 
+0

+1 - Мне нравится использование «аналитических функций». – sgeddes

+0

+1 для аналитической функции, я использую их много в T-SQL – user2281858