2014-11-19 4 views
2

У меня есть структуру таблицы, как показано ниже:Oracle SQL: Pivot столбец

product   supplier   price   qty 
-------   --------   -----   --- 
SOAP    ABC     50    10 
SOAP    DCE     50    10 
BRUSH   FGH     30    5 

Я хотел бы превратить эту таблицу в:

product   supplier_1  supplier_2   price   qty 
-------   --------   ----------   -----   --- 
SOAP    ABC     DCE    50    10 
BRUSH   FGH         30    5 

, как я могу сделать это в SQL? заранее спасибо.

+0

Что бы вы хотели показано, если второй поставщик имел разную цену на мыло? –

+0

будет средней ценой, а затем суммой для qty. – Ianthe

ответ

3

Может быть, это помогает:

select product, 
     max(case when rn = 1 then supplier end) as supplier_1, 
     max(case when rn = 2 then supplier end) as supplier_2, 
     -- ... 
     -- max(case when rn = n then supplier end) as supplier_n, 
     avg(price) as price, 
     sum(qty) as sum 
    from(select t.*, 
       row_number() over (partition by product order by supplier) rn 
     from your_table t 
    ) 
group 
    by product; 
+0

, он по-прежнему действителен, если есть более двух поставщиков ??? – psaraj12

+0

Если у вас есть максимальное количество поставщиков на продукт, вам нужно добавить соответствующее количество столбцов supplier_1 .. supplier_n. Динамический путь со статическим sql (возможно, с динамическим sql и plsql) отсутствует. – DirkNM

+0

Спасибо за ответ.^^ – Ianthe

0
select product,supplier_1,supplier_2,price,qty from table 
model 
return all rows 
dimension by(product) 
measures(supplier, 
    lpad(' ',10) supplier_1, 
    lpad(' ',10) supplier_2 
) 
rules upsert(
    supplier_1[0] = supplier['SOAP'], 
    supplier_2[0] = supplier['BRUSH'] 
) 

10G или 10G выше.

+0

оговорка о повороте, поддерживаемая в 11G, обратите внимание. – VikiYang

+0

Так грустно, мы все еще в 10G :( – Ianthe

+0

Вы можете использовать его, исправить свою проблему, я сказал, что вы можете выбрать другое предложение «pivot», если вы находитесь в 11G – VikiYang

Смежные вопросы