使用动态PL / SQL转换具有单行结果的未知数量的列

时间:2015-07-07 15:23:14

标签: oracle plsql transpose dynamicquery

我相信必须有一个简单的方法来实现这一目标,我只是没有弄明白。我正在寻找一种方法,但我找不到任何不会侵入聚合的东西,

我有一个动态查询(Oracle),我使用以下形式的配置表在循环中构建:

SELECT 
       b1.id1, 
       b2.id2,
       ...
FROM 
       table_a a, 
       table_b b1, 
       table_b b2, 
       ...
WHERE  
      a.id = a_variable
  AND (    b1.value (+)= a.column1 
       AND b2.value (+)= a.column2
       ...);

我总是希望这会返回一行,否则会抛出错误。我希望得到这样的结果:

---------------
|ID  | VALUE  |
---------------
|ID1 |      9 |
|ID2 |      8 |
|ID3 |   NULL |
|ID4 |      6 |
|...          |
---------------

而不是:

-----------------------------
|ID1  | ID2 | ID3 | ID4 | ...
-----------------------------
|   9 |   8 | NULL|   6 | ...
-----------------------------

提前致谢!!

2 个答案:

答案 0 :(得分:1)

在动态查询结束时做一个简单的动工:

SELECT *
FROM your_query
UNPIVOT INCLUDE NULLS (
  "VALUE" FOR id IN (ID1 ,ID2 ,ID3 ,ID4)
)

演示:http://sqlfiddle.com/#!4/10c35/2

答案 1 :(得分:0)

您提供的信息非常少,所以我的答案也只是我在申请前做过的一个例子。当然,这不是你问题的解决方案,但它可能会让你知道如何去做。

sqlstr := 'WITH t AS '||CHR(13);
sqlstr := sqlstr || '(SELECT START_TIME, WOC_ID, COUNT(WOC_ID) AS COUNT_TRIGGER '||CHR(13);
sqlstr := sqlstr || 'FROM P_KPI_DEF JOIN T_REPORT_KPI ON REKA_WOC_ID = WOC_ID '||CHR(13);
sqlstr := sqlstr || 'WHERE MO_ID = :objId ';
sqlstr := sqlstr || 'AND AGG_LEVEL = :aggLevel ';
sqlstr := sqlstr || 'GROUP BY START_TIME, WOC_ID) '||CHR(13);
sqlstr := sqlstr || 'SELECT * FROM t PIVOT (SUM(COUNT_TRIGGER) AS KPI_COUNT FOR WOC_ID IN (';
FOR aKPI IN (SELECT * FROM P_KPI_DEF) LOOP
    sqlstr := sqlstr || aKPI.WOC_ID||' AS '||aKPI.WOC_COLUMN_NAME||',';
END LOOP;
sqlstr := REGEXP_REPLACE(sqlstr, ',$', '))')||CHR(13);  
sqlstr := sqlstr || 'ORDER BY 1';
OPEN cur FOR sqlstr USING ...;