絕地無雙
2019-12-03 10:45:55
我有以下名為_kv的Oracle 10g表:select * from _kvID K V---- ----- ----- 1 name Bob 1 age 30 1 gender male 2 name Susan 2 status married我想使用普通SQL(而不是PL / SQL)將鍵轉(zhuǎn)換為列,以便生成的表如下所示:ID NAME AGE GENDER STATUS---- ----- ----- ------ -------- 1 Bob 30 male 2 Susan married該查詢應具有與表中K存在的unique一樣多的列(數(shù)量不多)在運行查詢之前,無法知道可能存在哪些列。我試圖避免運行初始查詢以編程方式構(gòu)建最終查詢??瞻讍卧窨梢詾閚ull或空字符串,并不重要。我正在使用Oracle 10g,但是11g解決方案也可以。當您知道您的透視列可能被稱為什么時,這里有很多示例,但是我只是找不到適用于Oracle的通用透視解決方案。謝謝!
3 回答

料青山看我應如是
TA貢獻1772條經(jīng)驗 獲得超8個贊
為了處理可能存在多個值(在您的示例中為v)的情況,我使用PIVOT和LISTAGG:
SELECT * FROM
(
SELECT id, k, v
FROM _kv
)
PIVOT
(
LISTAGG(v ,',')
WITHIN GROUP (ORDER BY k)
FOR k IN ('name', 'age','gender','status')
)
ORDER BY id;
由于需要動態(tài)值,因此在調(diào)用透視表語句之前,請使用動態(tài)SQL并傳遞通過在表數(shù)據(jù)上運行select所確定的值。

拉風的咖菲貓
TA貢獻1995條經(jīng)驗 獲得超2個贊
碰巧要完成一項任務。下面對我來說適用于11g的測試:
select * from
(
select ID, COUNTRY_NAME, TOTAL_COUNT from ONE_TABLE
)
pivot(
SUM(TOTAL_COUNT) for COUNTRY_NAME in (
'Canada', 'USA', 'Mexico'
)
);
添加回答
舉報
0/150
提交
取消