2010-08-13 5 views
3

У меня есть этот вид таблицыPivot/перекрестный запрос в Oracle 10g (Dynamic номер столбца)

UserName  Product  NumberPurchaces 
--------  -------  --------------- 
'John Doe' 'Chair'  4 
'John Doe' 'Table'  1 
'Jane Doe' 'Table'  2 
'Jane Doe' 'Bed'  1 

Как я могу создать запрос, который обеспечит этот вид поворота в Oracle 10g?

UserName Chair Table Bed 
-------- ----- ----- --- 
John Doe 4  1  0 
Jane Doe 0  2  1 

Любой способ сделать это динамически? Я видел так много подходов (циклы декодирования, PL/SQL, союзы, 11g шарнирных)

Но я еще, чтобы найти то, что будет работать для меня на основе вышеприведенного примера


Редактировать Я не знаю, количества или типа продукции во время разработки, так что это должно быть динамичным

+0

Вы не можете. Любой конкретный оператор SQL должен возвращать набор результатов с тем же числом столбцов, именем столбцов и типами столбцов –

ответ

4

Oracle 11g является первым для поддержки PIVOT/UNPIVOT, так что вы должны использовать:

SELECT t.username, 
     MAX(CASE WHEN t.product = 'Chair' THEN t.numberpurchases ELSE NULL END) AS chair, 
     MAX(CASE WHEN t.product = 'Table' THEN t.numberpurchases ELSE NULL END) AS tbl, 
     MAX(CASE WHEN t.product = 'Bed' THEN t.numberpurchases ELSE NULL END) AS bed 
    FROM TABLE t 
GROUP BY t.username 

Вы можете использовать DECODE, но CASE поддерживается с 9i.

+1

Спасибо !, Как это может стать динамическим сейчас? например не зная перед собой, что такое набор продуктов (динамический список, который неизвестен во время разработки) –

3

Я думаю, что нужно было бы написать код для динамического создания запроса. Каждая строка MAX() идентична, за исключением строк «CHAIR», «TABLE» и т. Д.

Таким образом, нужно было бы повторить данные, чтобы найти все продукты и создать второй запрос по мере прохождения. Затем выполните этот динамически построенный запрос.

+0

* rotfl * Вы отказали ответ от года назад? У вас должен быть веселый день :) – MatBailie

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