2016-05-12 12 views
0

I spezifischen Wert der Spalte als Spaltennamen müssen nicht Umwandlung Zeile Spalte durch folgende Abfrage mit Ergebnis mitWie als Spaltenname dynamicaly auf Spaltenwert in oracle plsql Abfrage

Blockquote

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; 

Das Ergebnis dieser Abfrage ist: -

 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 

Aber Meine Forderung das ist wie wie bei oben query: -

 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 

Für Quartal 3. Ergebnis wie sein wird: -

"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 

Dieses Ergebnis die Grundlagen der DM.MONTH_SID kommen Sie voll sein Bedürfnis vorschlagen.

+0

ist der einzige Unterschied wirklich der letzte Spalt Name? –

+0

Was passiert, wenn 'FIN_YEAR_QUARTER' mehr als einen Wert hat? – Aleksej

+0

Ich denke, die einzige Möglichkeit, einen dynamischen Header zu erhalten, besteht darin, ein sofortiges Ausführen auszuführen, um eine Ansicht zu erstellen und dann aus dieser Ansicht auszuwählen. Aber wie Aleksej fragte, was ist, wenn fin_year_quarter mehr als einen Wert hat. Und kann nicht auch Ihre Präsentationsebene die Spaltenüberschriften auf das setzen, was sie wollen? –

Antwort

0

Ich denke, das hängt vom Endbenutzer-Tool ab. Wenn Sie Oracle BI-Publisher verwenden, können Sie die Daten gemäß 1. Spalte gruppieren. Verwenden Sie dann den Wert in der 1. Spalte als Überschrift für die 4. Spalte.

2

Erstens kann 2015-2016-Q4 nicht als Spaltenname verwendet werden. Da es mit der Nummer beginnt und enthält Bindestriche zwischen finden Sie die folgenden Fehler auftreten:

ORA-00923: FROM keyword not found where expected 

Sie können jedoch column name als Q4_2015_2016

So etwas wie diese mit Dynamic SQL Versuchen verwenden -

 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-Ausgang:

DBMS_OUTPUT

Ausgabe der Abfrage oben erzeugt:

OUTPUT

PS: Ersetzen Sie Ihre Anfrage in den SQL_QUERY