2010-08-13 130 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