在Oracle 10g中的透视表/交叉表查询(动态列数)

3

我有这个表格视图

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枢轴),但是基于上面的例子,我还没有找到适合我的方法。


编辑:我不知道开发时产品的数量或类型,所以必须是动态的。


你不能这样做。任何特定的SQL语句必须返回一个具有相同列数、列名和数据类型的结果集。 - Gary Myers
2个回答

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了。

2
谢谢!现在该如何使其动态化呢?例如,不事先知道产品集是什么(即在设计时不知道的动态列表)。 - Eran Medan

3

我想你需要编写一些代码来动态创建查询。每个MAX()行都是相同的,除了'CHAIR','TABLE'等字符串。

因此,您需要迭代数据以查找所有产品并逐步构建第二个查询。然后执行动态构建的查询。


rotfl 你给一年前的回答点了踩?你今天一定很开心 :) - MatBailie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接