Oracle SQL:子查询因子与PIVOT结合使用

时间:2016-01-12 14:52:10

标签: sql oracle11g pivot

使用子查询因子和PIVOT会导致

ORA-56901: non-constant expression is not allowed for pivot|unpivot values

问题是(因为这正是我想要做的):是否可以使用先前查询的结果作为透视值?

我找到this ressource,其中内联语句与XML一起使用,但我无法弄清楚如何使其工作(没有XML关键字):< / p>

PIVOT (SUM(quantity) AS sum FOR (product_code) IN (SELECT DISTINCT product_code 
                                                            FROM   pivot_test
                                                            WHERE  id < 10));

到目前为止我得到了什么:

WITH KEYS AS (
  SELECT DISTINCT
    PARTKEY
  FROM MYKEYTABLE
)

SELECT
  *
FROM
(
  SELECT ID, PARTKEY 
  FROM MYVALUETABLE
)
PIVOT
(   
  COUNT(PARTKEY)
  FOR (PARTKEY) IN (KEYS)
);

期望的结果应该看起来像喜欢(哪些部分用于特定ID)

ID  |PARTKEY1|PARTKEY2|PARTKEY3
____|________|________|________
123 |1       |0       |1
456 |0       |1       |1

1 个答案:

答案 0 :(得分:1)

The documentation说明了数据透视子查询语法:

  

子查询仅与XML关键字一起使用。指定子查询时,子查询找到的所有值都用于旋转。输出与非XML数据透视查询返回的交叉表格格式不同。子查询不是在pivot_in_clause中指定多个列,而是生成单个XML字符串列。

因此,您不能将子查询与非XML数据透镜一起使用,因为这会在结果集中创建可变数量的列,而这是不允许的 - 必须在分析时知道列数。对于XML版本,始终只有一个XMLType列,因此不会排除您从子查询中获取的变量IN子句。