복붙노트

[SQL] 오라클 행의 여러 열에서 피벗을 사용하여

SQL

오라클 행의 여러 열에서 피벗을 사용하여

나는 Oracle 테이블 (TAB1)에 다음 예제 데이터를하고 난 컬럼에 행을 변환하려합니다. 나는 하나 개의 컬럼에 오라클 피벗을 사용하는 방법을 알고있다. 그러나 여러 컬럼에 적용 할 수 있습니까?

샘플 데이터 :

Type  weight  height  
A     50      10  
A     60      12  
B     40      8  
C     30      15  

내 의도 된 출력 :

A-count B-count C-count A-weight B-weight C-weight A-height B-height C-height  
2       1       1       110      40       30       22       8        15  

내가 할 수있는 것:

with T AS 
(select type, weight from tab1 )
select * from T
PIVOT (
count(type)
for type in (A, B, C, D,E,F)
)  

위의 쿼리는 나에게 아래의 결과를 제공

A B C  
2 1 1  

I 피벗 높이 또는 중량 합계 (중량) 또는 합 (높이)와 수 (*)를 대체 할 수있다. 내가 찾고 있어요,하지만 난 할 수없는 무엇, 하나 개의 쿼리에서 세 가지 (수, 무게와 높이)에 피벗입니다.

그것은 피벗을 사용하여 수행 할 수 있습니까?

해결법

  1. ==============================

    1.설명서에서 볼 수 있듯이, 여러 집계 함수 절을 가질 수 있습니다. 이 작업을 수행 할 수 있습니다 :

    설명서에서 볼 수 있듯이, 여러 집계 함수 절을 가질 수 있습니다. 이 작업을 수행 할 수 있습니다 :

    select * from (
      select * from tab1
    )
    pivot (
      count(type) as ct, sum(weight) as wt, sum(height) as ht
      for type in ('A' as A, 'B' as B, 'C' as C)
    );
    
    A_CT A_WT A_HT B_CT B_WT B_HT C_CT C_WT C_HT
    ---- ---- ---- ---- ---- ---- ---- ---- ----
       2  110   22    1   40    8    1   30   15 
    

    당신이 보여 순서대로 열을 원하는 경우 하위 쿼리의 다른 수준을 추가 :

    select a_ct, b_ct, c_ct, a_wt, b_wt, c_wt, a_ht, b_ht, c_ht
    from (
      select * from (
        select * from tab1
      )
      pivot (
        count(type) as ct, sum(weight) as wt, sum(height) as ht
        for type in ('A' as A, 'B' as B, 'C' as C)
      )
    );
    
    A_CT B_CT C_CT A_WT B_WT C_WT A_HT B_HT C_HT
    ---- ---- ---- ---- ---- ---- ---- ---- ----
       2    1    1  110   40   30   22    8   15 
    

    SQL 바이올린.

  2. ==============================

    2.열 이름을하는 두 번째 방법은 더 나은하고 해결할 수있는 문제 더 많은 문제. 나는 열 이름은 단순히 2를 추가하고 세 번째에서 필요한 결과를 얻을 수 필요하므로 PIVOT에서 반환 된 데이터를 요약하고 싶었 요구했다 -

    열 이름을하는 두 번째 방법은 더 나은하고 해결할 수있는 문제 더 많은 문제. 나는 열 이름은 단순히 2를 추가하고 세 번째에서 필요한 결과를 얻을 수 필요하므로 PIVOT에서 반환 된 데이터를 요약하고 싶었 요구했다 -

    select a_ct, b_ct, c_ct, a_wt, b_wt, c_wt, a_ht, b_ht, c_ht, a_wt + b_wt + c_wt tot_wt
    from (
      select * from (
        select * from tab1
      )
      pivot (
        count(type) as ct, sum(weight) as wt, sum(height) as ht
        for type in ('A' as A, 'B' as B, 'C' as C)
      )
    );
    
    A_CT B_CT C_CT A_WT B_WT C_WT A_HT B_HT C_HT TOT_WT
    ---- ---- ---- ---- ---- ---- ---- ---- ---- ------
       2    1    1  110   40   30   22    8   15 180
    

    그냥 PIVOT 열 사용 반환 널 중 하나가,이 경우에 나는 그것을 해결하기 위해 사용되는 CASE 문이있는 경우 예상대로 작동하지 않습니다 (합계 등)이 집계 함수를 조심.

    누군가가 도움이되기를 바랍니다.

  3. ==============================

    3.알렉스 풀에서 대답은 굉장 내 오라클 쿼리 내를 도왔다. 이 날 궁금하게 여기 나는 빨리 마이크로 소프트 PIVOT을 여러 열에 대한 오라클 구문 비교를 지적 할 것이다. 이것은 내가 실제로 오라클을 수여 할 하나 개의 영역 인 SQL 간단한 구문 상 (그것이 나에 의해 만들어진 만들어 상이다).

    알렉스 풀에서 대답은 굉장 내 오라클 쿼리 내를 도왔다. 이 날 궁금하게 여기 나는 빨리 마이크로 소프트 PIVOT을 여러 열에 대한 오라클 구문 비교를 지적 할 것이다. 이것은 내가 실제로 오라클을 수여 할 하나 개의 영역 인 SQL 간단한 구문 상 (그것이 나에 의해 만들어진 만들어 상이다).

    피벗 여러 열을 필요로 할 때 마이크로 소프트 SQL은 간단하고 유연한 거의 없습니다.

    동일한 데이터 집합을 감안할 때 :

    DECLARE @tblSampleData AS table (Type nvarchar(10), Weight numeric(5,2), Height numeric(5,2))
    
    INSERT INTO @tblSampleData (Type, Weight, Height)
    VALUES
    ('A',     50,      10) 
    ,('A',     60,      12) 
    ,('B',     40,      8 )
    ,('C',     30,      15)
    

    Mitsrosoft는 뿌린 :

    select * from 
    (
        select 
            *
            ,concat(Type,'1') as "Type1" 
            ,concat(Type,'2') as "Type2"
        from @tblSampleData
    ) AS src
    pivot (
        count(Type) --as ct, sum(weight) as wt, sum(height) as ht
        for Type in ([A], [B], [C])
    ) AS pvt1
    pivot (
        sum(weight) --as ct, sum(weight) as wt, sum(height) as ht
        for Type1 in ([A1], [B1], [C1])
    ) AS pvt1
    pivot (
        sum(height) --as ct, sum(weight) as wt, sum(height) as ht
        for Type2 in ([A2], [B2], [C2])
    ) AS pvt1
    
  4. from https://stackoverflow.com/questions/23939244/using-pivot-on-multiple-columns-of-an-oracle-row by cc-by-sa and MIT license