2011-08-05 1 views
0

У меня есть таблица с именем TABLE, например, выглядит как:Oracle10g SQL поворота

ID | email 
-------------- 
1 | [email protected] 
1 | [email protected] 
2 | [email protected] 
3 | [email protected] 
3 | [email protected] 

, и я хотел бы вернуть что-то вроде

ID | email1 | email2 
-------------------- 
1 | [email protected]| [email protected] 
2 | [email protected]| 
3 | [email protected]| [email protected] 

мне было интересно, как я мог бы использовать поворачиваясь, чтобы помочь мне избавиться от повторяющихся строк 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)); 

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

ответ

0

Я предпочитаю использовать 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(max(email) FOR emailRank IN (1,2,3)); 
+0

Большое спасибо. Это работает так, как мне нужно. Однако, когда я пытаюсь использовать метод поворота, я получаю выражение MISSING, где [1] AS email1 в первой строке ... Не возражаете ли вы объяснить, что не так с моим синтаксисом? – bph

+0

добавил код, который, я считаю, исправит исходный опорный запрос OP. Маленькая опечатка (nax vs max) и отсутствует ")". Также заменил [1] на 1. – beach

+0

Извините, что это были опечатки только в моем посте. Однако использование этих 1, 2, 3, похоже, не работает. Я получаю запрос, но он выглядит как email1 с 1, электронной почтой 2 с 2 и т. Д. Он не показывает электронные письма, такие как [email protected] – bph

0

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

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

+0

Я думаю, мне нужно сохранить все это в одном запросе SELECT, поэтому я думаю, что мне может понадобиться сделать это комбо группы и декодировать. Собираюсь ли я группировать по ID, а затем использовать декодирование для остальных? – bph

+0

Да, вы в основном используете декодирование, чтобы определить, что значение столбцов основано на текущей строке. Я думаю, что этот подход хорош, если вы не так много столбцов. – Hyangelo

Смежные вопросы