在oracle

时间:2016-03-02 13:57:31

标签: oracle oracle11g

我正在寻找oracle.i中的动态转置行到列已经尝试使用pivot或在解码的帮助下进行转置但是我需要提供硬编码列名称,因为我已经给出了#1;第1轮(AJM-15)'和第二轮(AJM-15)'在下面的查询但我试图动态地实现这些值是可能的。

SELECT CC.WARD,SUM(DECODE(CC.QTR, 'Round 1 (AJM-15)',round(CC.METRIC_VALUE,3), 0)) AS "Round 1 (AJM-15)",
               SUM(DECODE(CC.QTR, 'Round 2 (AJM-15)',round(CC.METRIC_VALUE,3), 0)) AS "Round 2 (AJM-15)"

             From   (
SELECT SUM(DENO) AS METRIC_VALUE,CENTRE,QTR,WARD FROM (
       select CENTRE,QTR,WARD,sum(COUNTS) AS DENO from FACT_AVF_RESP
        where 
         outlet_type in (SELECT distinct outlet_type
                       FROM FACT_AVF_RESP m
                       WHERE outlet_type IN (SELECT distinct outlet_type FROM FACT_AVF_RESP)
                       AND 'All' = 'All'
                       UNION
                       SELECT distinct outlet_type
                       FROM FACT_AVF_RESP n
                       WHERE outlet_type ='All'
                             )  and
        CENTRE= 'AHMEDABAD' and 
        gpi in (SELECT distinct gpi
                       FROM FACT_AVF_RESP o
                       WHERE gpi IN (SELECT distinct gpi FROM FACT_AVF_RESP)
                       AND 'All' = 'All'
                       UNION
                       SELECT distinct gpi
                       FROM FACT_AVF_RESP o
                       WHERE gpi ='All'
                             ) AND
       QTR in (select distinct p.qtr from fact_avf_nd p where p.qtr 
                                          between 'Round 1 (AJM-15)' and 'Round 2 (AJM-15)') 

        group by  QTR,CENTRE,WARD    
  order by QTR
  )group by  CENTRE,QTR,WARD
  ORDER BY QTR,WARD)cc
  group by CC.WARD;

在中间条件下,我必须根据提供参数值提供from和to参数值,我的qtr列值将会出现,并且该列值应该动态转置。

1 个答案:

答案 0 :(得分:0)

如果不使用动态sql,无法实现这一目标。

OCI和JDBC api允许调用者在执行之前描述查询的列。您想要的不是确定性的,即Oracle可能会注意到在评估查询时还有其他列要添加。这违反了API合同。

无论数据性质如何,每个查询结果都必须具有固定数量的列。 还有构造PIVOT XML,它可以做你想要的。将只添加一列,在XML文档中连接动态添加的列。