Oracle10g SQL Pivot - PullRequest
       20

Oracle10g SQL Pivot

0 голосов
/ 06 августа 2011

У меня есть таблица с именем TABLE, например, похожая на:

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

Мне было интересно, как я могу использовать поворот, чтобы помочь мне избавиться от повторяющихся строк идентификаторов и просто добавить дополнительный столбец для их других электронных писем. Спасибо за помощь.

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));

Редактировать: исправлено выше благодаря ответу пляжа

Ответы [ 2 ]

0 голосов
/ 06 августа 2011

Я предпочитаю использовать решение GROUP BY с выражением CASE.

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 имел тип и отсутствовал ")".Попробуйте сделать следующее:

pivot( max(email) FOR emailRank IN (1,2,3));
0 голосов
/ 06 августа 2011

Вы можете использовать процедуру или комбинацию групп по rownum и decode. Лично я нахожу порядок действий более чистым.

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

...