我相信必须有一个简单的方法来实现这一目标,我只是没有弄明白。我正在寻找一种方法,但我找不到任何不会侵入聚合的东西,
我有一个动态查询(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 | ...
-----------------------------
提前致谢!!
答案 0 :(得分:1)
在动态查询结束时做一个简单的动工:
SELECT *
FROM your_query
UNPIVOT INCLUDE NULLS (
"VALUE" FOR id IN (ID1 ,ID2 ,ID3 ,ID4)
)
答案 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 ...;