2016-05-12 2 views
0

мне нужно конкретное значение столбца в качестве имени столбца не преобразование строки к столбцу с помощью следующего запроса с результатомКак столбец значения в качестве имени столбца dynamicaly в Oracle PLSQL запросе

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; 

результат этого запроса: -

 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 пожалуйста предложить свою потребность полностью.

+0

Это единственное различие действительно окончательное название столбца? –

+0

Что делать, если 'FIN_YEAR_QUARTER' имеет более одного значения? – Aleksej

+0

Я думаю, что единственный способ получить динамический заголовок - выполнить немедленное выполнение, чтобы создать представление, а затем выбрать из этого представления. но опять же, когда Алексей спросил, что, если fin_year_quarter имеет более одного значения. а также не может ли ваш слой презентации просто устанавливать заголовки столбцов на все, что он хочет? –

ответ

0

Я думаю, что это зависит от инструмента конечного пользователя. Если вы используете Oracle BI-издатель, вы можете группировать данные в соответствии с 1-м столбцом. А затем используйте значение в 1-ом столбце как заголовок для 4-го.

2

Во-первых, вы не можете иметь 2015-2016-Q4 в качестве имени столбца. Так как, начиная с числа и содержит дефис между ними, вы столкнетесь ниже сообщение об ошибке:

ORA-00923: FROM keyword not found where expected 

Однако, вы можете использовать column name в Q4_2015_2016

попробовать что-то вроде этого с помощью Dynamic 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 Блок Выход:

DBMS_OUTPUT

выход запроса генерируется выше:

OUTPUT

PS: Замените ваш запрос в SQL_QUERY