2010-08-13 103 views
3

我有此表視圖樞軸/交叉表查詢Oracle 10g中(動態列數)

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語句必須返回結果集的列數,列的名稱和列的數據類型 – 2010-08-13 23:38:03

回答

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,但自9i以來,CASE一直受到支持。

+1

謝謝!現在如何變得動態?例如不知道前面是什麼產品設置(動態列表,在設計時間不知道) – 2010-08-13 18:49:44

3

我想你必須編寫一些代碼來動態創建查詢。除了'CHAIR','TABLE'等字符串以外,每個MAX()行都是相同的。

因此,人們必須通過數據來檢查所有產品並建立第二個查詢。然後執行那個動態構建的查詢。

+0

* rotfl *你從一年前低估了答案?你一定有一個有趣的一天:) – MatBailie 2011-06-22 12:21:26