2

我正在 Oracle 11g 数据库上开发 PL/SQL Developer v10。这个想法不是写PIVOT语句中列出的 145 列 write an Pivot XMLand get data from there,而是根据这个答案工作,因为我以前从未在 Oracle 上做过 PIVOT XML,所以我的期望可能是错误的

select * from (
                    select
                      tqs.transactiondetailid as transactiondetailid,
                      q.productid as productid,
                      tqs.answer as QAnswer,
                      regexp_substr(q.questiondescription,'(WIF|DT|WT)[([:digit:]|.)]*') as QDesc,
                      tqs.transactionversion as transactionversion
                    from TRANSACTIONDETAILQS tqs
                    inner join question q on q.questionid = tqs.questionid and (
                          q.questiondescription like 'DT%' 
                          or  q.questiondescription like 'WT%' 
                          or q.questiondescription like 'WIF%')
    ) pivot xml(
    min(QAnswer) for QDesc in (
    select regexp_substr(q.questiondescription,'(WIF|DT|WT)[([:digit:]|.)]*') as r from question q
    where regexp_substr(q.questiondescription,'(WIF|DT|WT)[([:digit:]|.)]*') IS NOT NULL)
    )

在 XML 列中不返回任何数据,它们都是空的,但是下面我明确列出列的语句可以正常工作

select * from (
                    select
                      tqs.transactiondetailid as transactiondetailid,
                      q.productid as productid,
                      tqs.answer as QAnswer,
                      regexp_substr(q.questiondescription,'(WIF|DT|WT)[([:digit:]|.)]*') as QDesc,
                      tqs.transactionversion as transactionversion
                    from TRANSACTIONDETAILQS tqs
                    inner join question q on q.questionid = tqs.questionid and (
                          q.questiondescription like 'DT%' 
                          or  q.questiondescription like 'WT%' 
                          or q.questiondescription like 'WIF%')
    ) pivot (
    min(QAnswer) for QDesc in (
    'DT01.','DT02.','WT01.')
    )

如何在不明确列出列的情况下进行旋转?

4

1 回答 1

2

我把它归结为问题

min(QAnswer) for QDesc In (
    select 'DT01.','DT02.','WT01.' from dual )
) 

不工作,但是

min(QAnswer) for QDesc In (
    'DT01.','DT02.','WT01.')
)

工作正常。

一种方法是创建动态 PL/SQL,但我没有足够的勇气这样做。

于 2015-05-19T10:49:28.150 回答