복붙노트

[SQL] 오라클 10g SQL 피벗

SQL

오라클 10g SQL 피벗

나는 예를 들어라는 테이블 테이블처럼 찾고 있습니다 :

ID  | email
--------------
1   |  a@a.com 
1   |  b@b.com
2   |  c@c.com
3   |  d@d.com
3   |  e@e.com

내가 좋아하는 뭔가를 반환하고 싶습니다

ID | email1 | email2
--------------------
1  | a@a.com| b@b.com
2  | c@c.com|
3  | d@d.com| e@e.com

나는 나를이 중복 ID 행을 제거하는 데 도움과 그들의 다른 이메일에 대한 여분의 열을 추가 선회 사용할 수 있는지 궁금 해서요. 도와 주셔서 감사합니다.

SELECT id, email1, email2, email3
FROM (
SELECT id, 
        email, 
        ROW_NUMBER() OVER (PARTITION BY id ORDER BY email) AS emailRank
FROM TABLE
) 
pivot( max(email) FOR emailRank IN (1 as email1, 2 as email2, 3 as email3));

편집 : 감사 위의 고정 된 해변의 대답

해결법

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

    1.나는 CASE 식 솔루션은 GROUP BY를 사용하여 선호합니다.

    나는 CASE 식 솔루션은 GROUP BY를 사용하여 선호합니다.

    SELECT 
        id,
        MAX(CASE WHEN emailRank = 1 THEN email END) AS [1],
        MAX(CASE WHEN emailRank = 2 THEN email END) AS [2],
        MAX(CASE WHEN emailRank = 3 THEN email END) AS [3],
        MAX(CASE WHEN emailRank = 4 THEN email END) AS [4]
    FROM (
        SELECT
            id, 
            email, 
            ROW_NUMBER() OVER (PARTITION BY id ORDER BY email) AS emailRank
        FROM TABLE
    )
    GROUP BY id;
    

    원래 피벗 예는 종류와 ")"누락했다. 피벗 작업을 얻기 위해 다음을 시도해보십시오

    pivot( max(email) FOR emailRank IN (1,2,3));
    
  2. ==============================

    2.당신은 프로 시저 또는 ROWNUM 및 디코딩하여 그룹의 조합을 사용할 수 있습니다. 개인적으로, 나는 프로 시저 접근 청소기를 찾을 수 있습니다.

    당신은 프로 시저 또는 ROWNUM 및 디코딩하여 그룹의 조합을 사용할 수 있습니다. 개인적으로, 나는 프로 시저 접근 청소기를 찾을 수 있습니다.

    참조 : http://asktom.oracle.com/pls/apex/f?p=100:11:0::NO::P11_QUESTION_ID:15151874723724

  3. from https://stackoverflow.com/questions/6963684/oracle10g-sql-pivot by cc-by-sa and MIT license