如何在oracle plsql查询

时间:2016-05-12 11:05:40

标签: oracle plsql oracle10g oracle-sqldeveloper

我需要将列的特定值作为列名,而不是通过使用以下查询结果

将行转换为列
  

块引用

 SELECT AAA.fin_year_quarter,AAA.GEOG_STATE_NAME,AAA.SKU_NAME,SUM(AAA.VALUE) 
     FROM (
              SELECT DISTINCT dm.fin_year_quarter,FCPS.TERRITORY_SID,
                               DG.GEOG_STATE_NAME,dp.sku_name,
                               SUM(FCPS.PRIMARY_SALES_VALUE) AS VALUE
               FROM fact_chw_primary_sales FCPS,DIM_GEOGRAPHY
                     DG,dim_productdp,dim_month dm
               WHERE FCPS.TERRITORY_SID=DG.TERRITORY_SID
               and  fcps.product_sid=dp.product_sid
               and fcps.month_sid=dm.month_sid
               AND DM.MONTH_SID=5845
               GROUP BY FCPS.TERRITORY_SID,DG.GEOG_STATE_NAME,  
                       dp.sku_name,dm.fin_year_quarter
             )AAA
      GROUP BY AAA.GEOG_STATE_NAME,AAA.SKU_NAME,AAA.fin_year_quarter
      ORDER BY AAA.GEOG_STATE_NAME ASC, SUM(AAA.VALUE) DESC,AAA.SKU_NAME ASC;

此查询的结果是: -

        FIN_YEAR_QUARTER GEOG_STATE_NAME   SKU_NAME    **SUM(AAA.VALUE)**
      **2015-2016-Q4**   DELHI-0801        PVPM0017G    4195295
        2015-2016-Q4     DELHI-0801        RGPRM035G    3191880
        2015-2016-Q4     DELHI-0801        RGPM0035G    1397599
        2015-2016-Q4     DELHI-0801        PVPR0017G    250369.5
        2015-2016-Q4     DELHI-0801        PVPM0180G    65248.22
        2015-2016-Q4     DELHI-0801        PVPM1000G    42258.18
        2015-2016-Q4     DELHI-0801        PVPS0380G    9272.4

但我的要求与上述查询一样: -

        FIN_YEAR_QUARTER GEOG_STATE_NAME   SKU_NAME   **2015-2016-Q4**
      **2015-2016-Q4**   DELHI-0801        PVPM0017G    4195295
        2015-2016-Q4     DELHI-0801        RGPRM035G    3191880
        2015-2016-Q4     DELHI-0801        RGPM0035G    1397599
        2015-2016-Q4     DELHI-0801        PVPR0017G    250369.5
        2015-2016-Q4     DELHI-0801        PVPM0180G    65248.22
        2015-2016-Q4     DELHI-0801        PVPM1000G    42258.18
        2015-2016-Q4     DELHI-0801        PVPS0380G    9272.4

第三季度的结果将如下: -

 "FIN_YEAR_QUARTER" "GEOG_STATE_NAME"  "SKU_NAME"   **"2015-2016-Q3"**

  **2015-2016-Q3**   BOMBAY-0802      PVPM00173G  5195292
    2015-2016-Q3     BOMBAY-0802        RGPRM0353G    4191881
    2015-2016-Q3     BOMBAY-0802        RGPM00353G    39759
    2015-2016-Q3     BOMBAY-0802        PVPR00173G    2503.5
    2015-2016-Q3     BOMBAY-0802        PVPM01803G    652.22
    2015-2016-Q3     BOMBAY-0802        PVPM10003G    14225.18
    2015-2016-Q3     BOMBAY-0802        PVPS03803G    927200.4

此结果将成为DM.​​MONTH_SID的基础,请建议其需要完整。

1 个答案:

答案 0 :(得分:2)

首先,您不能将2015-2016-Q4作为列名。由于它以数字开头并且中间包含连字符,因此您将遇到以下错误:

    ORA-00923: FROM keyword not found where expected

但是,您可以将column name用作Q4_2015_2016

使用动态SQL尝试这样的事情 -

     DECLARE 
     sql_query varchar(400);
     Var1 varchar2(20);
     BEGIN
     select  distinct 
     (case  FIN_YEAR_QUARTER when '2015-2016-Q4' then 'Q4_2015_2016' else 'NOT Q4' end )
     into Var1 
     from SALES;
     sql_query := ' select GEOG_STATE_NAME,FIN_YEAR_QUARTER,value as  ' || var1 || '
                    from SALES ' ; 
    dbms_output.put_line('Generated SQL is  =>  ' ||chr(10)||chr(13)|| sql_query);
    END;

Pl / sql Block输出:

DBMS_OUTPUT

上面生成的查询的输出:

OUTPUT

PS:在SQL_QUERY

中替换您的查询