2016-12-21 4 views
3

행을 행 유형별로 행을 열로 변환하려고합니다.
는 여기 된 table_1 Table_1집계 함수가없는 피벗 또는 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 

를 부여하고 결과에서 선택 스크립트 내가 PIVOT과 노력 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 

처럼 먹고 싶어. 하지만 집계 함수가 있어야합니다.
집계 함수 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    
오라클 11.1에서
+-------------+---------------+---------------+ 
| 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

이상, 당신은 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.