sql - Oracle 10g 中的数据透视表/交叉表查询(动态列号)

标签 sql oracle pivot transformation

我有这个 TableView

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

如何在 Oracle 10g 中创建将提供此数据透视 View 的查询?

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

有什么动态的方法吗?我看到了很多方法(解码、PL/SQL 循环、联合、11g 枢轴)

但是我还没有根据上面的例子找到对我有用的东西


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

最佳答案

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。

关于sql - Oracle 10g 中的数据透视表/交叉表查询(动态列号),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3479740/

相关文章:

sql - Oracle SQLPlus : print column titles in header when there is no output rows (showing "no rows selected" message)

mysql - 如何在 MySQL 中返回数据透视表输出?

mysql - 大查询会影响性能

sql - 合并结果或留给客户端浏览器 javascript 的高效 SQL?

sql - 如何知道 MATERIALIZED VIEW 更新是否正在运行?

java - Oracle调用另一台机器上的Java方法

mysql - 在 MySQL 中如何查询 1 行中的 2 列?

php - MySQL返回相同数据的不同行

python - 如何使用每小时值和日期时间索引将宽格式转换为长格式?

mysql - SQL查询按月排序和分组的数据