2016-12-21 1 views
3

Я пытаюсь преобразовать строки в столбцы по типу строки.
Здесь дается Table_1 Table_1Pivot без агрегатной функции или строки в столбцы по группе в Oracle

  Table_1 
CITY   AMOUNT  TYPE_ID 
Moscow   158000   1 
New York  94500   1 
Moscow   1478000   2 
Los Angeles 162000   2 
New York  5500000   2 
Los Angeles 35400   1 
Moscow   741200   1 

и выберите сценарий в итоге я хочу взять, как в Table_2 Table_2

  Table_2 
CITY   TYPE_1_AMOUNT  TYPE_2_AMOUNT 
Moscow   158000    1478000 
Moscow   741200     NULL 
New York   94500    5500000 
Los Angeles  35400    162000 

Я попытался с PIVOT. но должна быть агрегатная функция.
Агрегатная функция MAX() возвращает только максимальное количество ...

+0

Привет, Пожалуйста, замените изображения текстом. Просто поставьте его запятыми/вкладками в качестве разделителей, и я отформатирую его позже. –

ответ

4
select  city 
      ,min (case type_id when 1 then amount end) as type_1_amount 
      ,min (case type_id when 2 then amount end) as type_2_amount 

from  (select  city,type_id,amount 

         ,row_number() over 
         (
          partition by city,type_id 
          order by  amount 
         ) as rn 

      from  Table_1 
      ) 

group by city 
      ,rn 

order by city 
      ,rn    

+-------------+---------------+---------------+ 
| CITY  | TYPE_1_AMOUNT | TYPE_2_AMOUNT | 
+-------------+---------------+---------------+ 
| Los Angeles | 35400   | 162000  | 
+-------------+---------------+---------------+ 
| Moscow  | 158000  | 1478000  | 
+-------------+---------------+---------------+ 
| Moscow  | 741200  | (null)  | 
+-------------+---------------+---------------+ 
| New York | 94500   | 5500000  | 
+-------------+---------------+---------------+ 
+0

Thnx много! Оно работает! –

+0

Добро пожаловать :-) –

1

В Oracle 11.1 и выше, вы можете сделать то же самое с оператором PIVOT - но сначала вы должны различать строки с чем-то вроде row_number() в любом случае (так же, как в решении Dudu). Решение PIVOT выглядит так:

with 
    table_1 (city, amount, type_id) as (
     select 'Moscow'  , 158000, 1 from dual union all 
     select 'New York' , 94500, 1 from dual union all 
     select 'Moscow'  , 1478000, 2 from dual union all 
     select 'Los Angeles', 162000, 2 from dual union all 
     select 'New York' , 5500000, 2 from dual union all 
     select 'Los Angeles', 35400, 1 from dual union all 
     select 'Moscow'  , 741200, 1 from dual 
    ) 
-- end of test data; SQL query begins below this line 
select city, type_1, type_2 
from (select city, amount, type_id, 
       row_number() over (partition by city, type_id order by amount) as rn 
     from table_1 
     ) 
pivot (min(amount) for type_id in (1 as type_1, 2 as type_2)) 
order by city, type_1, type_2 -- ORDER BY is optional 
; 

CITY   TYPE_1  TYPE_2 
----------- ---------- ---------- 
Los Angeles  35400  162000 
Moscow   158000 1478000 
Moscow   741200 
New York   94500 5500000 

4 rows selected. 
Смежные вопросы