2013-10-24 5 views
-3

Требование состоит в том, чтобы повторно использовать результаты в формате сводной таблицы.ORACLE PIVOT QUERY 10G

У нас есть 22 стола каждый месяц, каждая таблица имеет около 1,5 миллионов строк. Желаемый результат - это 22 таблицы, содержащей информацию о каждом продукте/категории и необходимость в продукте в формате столбца

В 11 г мы использовали функцию поворота для воспроизведения и 10 г мы написали следующий запрос. Этот запрос продолжает работать в течение 1 дня и не сохраняет никаких результатов, так как функция максимального агрегата занимает огромное время для вычисления. Есть ли способ переписать следующий запрос.

SELECT year,month,account_id,media_id,status, 
     max(CP1) AS     CP, 
     max(CA1) AS     CA, 
     max(CU1) AS     CU, 
     max(GENDER1) AS     GENDER, 
     max(AGE1) AS    AGE, 
     max(AREA1) AS    AREA, 
     max(SB1) AS    SB, 
     max(SSP1) AS    SSP, 
     max(SRP) AS   scheme_redem_prpt, 
     max(BAL1) AS   BAL, 
     max(PTS_RE1) AS  PTS_RE, 
     max(PTS_EA1) AS  PTS_EA, 
     max(dept_01_txn1) AS    dept_01_txn, 
     max(dept_02_txn1) AS    dept_02_txn, 
     max(dept_03_txn1) AS    dept_03_txn, 
     max(dept_04_txn1) AS    dept_04_txn, 
     max(dept_05_txn1) AS    dept_05_txn, 
     max(dept_01_amt1) AS    dept_01_amt, 
     max(dept_02_amt1) AS    dept_02_amt, 
     max(dept_03_amt1) AS    dept_03_amt, 
     max(dept_04_amt1) AS    dept_04_amt, 
     max(dept_05_amt1) AS    dept_05_amt 
    FROM (SELECT year,month,account_id,media_id,status, 
       nvl(decode(prdatt_id,util_pkg.fnc_get_Value('CR1') , prdatt_value, null),'00') AS CP1, 
       nvl(decode(prdatt_id,util_pkg.fnc_get_Value('CR2') , prdatt_value, null),'00') AS CA1, 
       nvl(decode(prdatt_id,util_pkg.fnc_get_Value('CR3') , prdatt_value, null),'00') AS CU1, 
       nvl(decode(prdatt_id,util_pkg.fnc_get_Value('GENDER') , prdatt_value, null),'00') AS GENDER1, 
       nvl(decode(prdatt_id,util_pkg.fnc_get_Value('AGE') , prdatt_value, null),'00') AS AGE1, 
       nvl(decode(prdatt_id,util_pkg.fnc_get_Value('AREA') , prdatt_value, null),'00') AS AREA1, 
       nvl(decode(prdatt_id,util_pkg.fnc_get_Value('SB1') , prdatt_value, null),'00') AS SB1, 
       nvl(decode(prdatt_id,util_pkg.fnc_get_Value('SB2') , prdatt_value, null),'00') AS SSP1, 
       nvl(decode(prdatt_id,util_pkg.fnc_get_Value('SB3') , prdatt_value, null),'00') AS SRP, 
       nvl(decode(prdatt_id,util_pkg.fnc_get_Value('SR1') , prdatt_value, null),'00') AS BAL1, 
       nvl(decode(prdatt_id,util_pkg.fnc_get_Value('SR2') , prdatt_value, null),'00') AS PTS_RE1, 
       nvl(decode(prdatt_id,util_pkg.fnc_get_Value('SR3') , prdatt_value, null),'00') AS PTS_EA1, 
       nvl(decode(prdatt_id,util_pkg.fnc_get_Value('DEPT_01_TXN') , prdatt_value, null),'00') AS dept_01_txn1, 
       nvl(decode(prdatt_id,util_pkg.fnc_get_Value('DEPT_02_TXN') , prdatt_value, null),'00') AS dept_02_txn1, 
       nvl(decode(prdatt_id,util_pkg.fnc_get_Value('DEPT_03_TXN') , prdatt_value, null),'00') AS dept_03_txn1, 
       nvl(decode(prdatt_id,util_pkg.fnc_get_Value('DEPT_04_TXN') , prdatt_value, null),'00') AS dept_04_txn1, 
       nvl(decode(prdatt_id,util_pkg.fnc_get_Value('DEPT_05_TXN'), prdatt_value, null),'00') AS dept_05_txn1, 
       nvl(decode(prdatt_id,util_pkg.fnc_get_Value('DEPT_01_AMT') , prdatt_value, null),'00') AS dept_01_amt1, 
       nvl(decode(prdatt_id,util_pkg.fnc_get_Value('DEPT_02_AMT') , prdatt_value, null),'00') AS dept_02_amt1, 
       nvl(decode(prdatt_id,util_pkg.fnc_get_Value('DEPT_03_AMT') , prdatt_value, null),'00') AS dept_03_amt1, 
       nvl(decode(prdatt_id,util_pkg.fnc_get_Value('DEPT_04_AMT') , prdatt_value, null),'00') AS dept_04_amt1, 
       nvl(decode(prdatt_id,util_pkg.fnc_get_Value('DEPT_05_AMT') , prdatt_value, null),'00') AS dept_05_amt1 
     FROM (
      select year, month, account_id, media_id,prdatt_id, prdatt_iid, prdatt_value , status 
       from ac_prd_tab_01 
      union all 
      select year, month, account_id, media_id,prdatt_id, prdatt_iid, prdatt_value , status 
       from ac_prd_tab_02 
      union all 
      select year, month, account_id, media_id,prdatt_id, prdatt_iid, prdatt_value , status 
       from ac_prd_tab_03 
      union all 
      select a.year, a.month, a.account_id, b.media_id , a.prdatt_id, a.prdatt_iid, a.prdatt_value , a.status 
      from ac_prd_tab_04 a, 
       dtl_monthly b 
      where a.year= b.year and a.month=b.month and a.account_id=b.account_id 
      union all 
      select a.year, a.month, a.account_id, b.media_id , a.prdatt_id, a.prdatt_iid, a.prdatt_value , a.status 
       from ac_prd_tab_05 a, 
        dtl_monthly b 
      where a.year= b.year and a.month=b.month and a.account_id=b.account_id 
      union all 
      select a.year, a.month, a.account_id, b.media_id , a.prdatt_id, a.prdatt_iid, a.prdatt_value , a.status 
       from ac_prd_tab_06 a, 
        dtl_monthly b 
      where a.year= b.year and a.month=b.month and a.account_id=b.account_id 
      union all 
      select a.year, a.month, a.account_id, b.media_id , a.prdatt_id, a.prdatt_iid, a.prdatt_value , a.status 
       from ac_prd_tab_07 a, 
        dtl_monthly b 
      where a.year= b.year and a.month=b.month and a.account_id=b.account_id 
      union all 
      select a.year, a.month, a.account_id, b.media_id , a.prdatt_id, a.prdatt_iid, a.prdatt_value , a.status 
      from ac_prd_tab_08 a, 
       dtl_monthly b 
      where a.year= b.year and a.month=b.month and a.account_id=b.account_id 
      union all 
      select a.year, a.month, a.account_id, b.media_id , a.prdatt_id, a.prdatt_iid, a.prdatt_value , a.status 
      from ac_prd_tab_09 a, 
       dtl_monthly b 
      where a.year= b.year and a.month=b.month and a.account_id=b.account_id 
      union all 
      select a.year, a.month, a.account_id, b.media_id , a.prdatt_id, a.prdatt_iid, a.prdatt_value , a.status 
      from ac_prd_tab_10 a, 
       dtl_monthly b 
      where a.year= b.year and a.month=b.month and a.account_id=b.account_id 
      union all 
      select a.year, a.month, a.account_id, b.media_id , a.prdatt_id, a.prdatt_iid, a.prdatt_value , a.status 
      from ac_prd_tab_11 a, 
       dtl_monthly b 
      where a.year= b.year and a.month=b.month and a.account_id=b.account_id 
      union all 
      select a.year, a.month, a.account_id, b.media_id , a.prdatt_id, a.prdatt_iid, a.prdatt_value , a.status 
      from ac_prd_tab_12 a, 
       dtl_monthly b 
      where a.year= b.year and a.month=b.month and a.account_id=b.account_id 
      union all 
      select a.year, a.month, a.account_id, b.media_id , a.prdatt_id, a.prdatt_iid, a.prdatt_value , a.status 
      from ac_prd_tab_13 a, 
       dtl_monthly b 
      where a.year= b.year and a.month=b.month and a.account_id=b.account_id 
      union all 
      select a.year, a.month, a.account_id, b.media_id , a.prdatt_id, a.prdatt_iid, a.prdatt_value , a.status 
      from ac_prd_tab_14 a, 
       dtl_monthly b 
      where a.year= b.year and a.month=b.month and a.account_id=b.account_id 
      union all 
      select a.year, a.month, a.account_id, b.media_id , a.prdatt_id, a.prdatt_iid, a.prdatt_value , a.status 
      from ac_prd_tab_15 a, 
       dtl_monthly b 
      where a.year= b.year and a.month=b.month and a.account_id=b.account_id 
      union all 
      select a.year, a.month, a.account_id, b.media_id , a.prdatt_id, a.prdatt_iid, a.prdatt_value , a.status 
      from ac_prd_tab_16 a, 
       dtl_monthly b 
      where a.year= b.year and a.month=b.month and a.account_id=b.account_id 
      union all 
      select a.year, a.month, a.account_id, b.media_id , a.prdatt_id, a.prdatt_iid, a.prdatt_value , a.status 
      from ac_prd_tab_17 a, 
       dtl_monthly b 
      where a.year= b.year and a.month=b.month and a.account_id=b.account_id 
      union all 
      select a.year, a.month, a.account_id, b.media_id , a.prdatt_id, a.prdatt_iid, a.prdatt_value , a.status 
       from ac_prd_tab_18 a, 
        dtl_monthly b 
      where a.year= b.year and a.month=b.month and a.account_id=b.account_id 
      union all 
      select a.year, a.month, a.account_id, b.media_id , a.prdatt_id, a.prdatt_iid, a.prdatt_value , a.status 
      from ac_prd_tab_19 a, 
       dtl_monthly b 
      where a.year= b.year and a.month=b.month and a.account_id=b.account_id 
      union all 
      select a.year, a.month, a.account_id, b.media_id , a.prdatt_id, a.prdatt_iid, a.prdatt_value , a.status 
      from ac_prd_tab_20 a, 
       dtl_monthly b 
      where a.year= b.year and a.month=b.month and a.account_id=b.account_id 
      union all 
      select a.year, a.month, a.account_id, b.media_id , a.prdatt_id, a.prdatt_iid, a.prdatt_value , a.status 
      from ac_prd_tab_21 a, 
       dtl_monthly b 
      where a.year= b.year and a.month=b.month and a.account_id=b.account_id 
      union all 
      select a.year, a.month, a.account_id, b.media_id , a.prdatt_id, a.prdatt_iid, a.prdatt_value , a.status 
      from ac_prd_tab_22 a, 
       dtl_monthly b 
      where a.year= b.year and a.month=b.month and a.account_id=b.account_id 
      ) 
     ) 
    GROUP BY year,month,account_id, media_id,status 
/
+1

Чтение вашего запроса не было забавным. – Zane

+1

Представьте себе, что это – mucio

+2

@mucio Я бы не написал этот запрос. – Zane

ответ

1

Помимо максимального использования вы также используете множество функций.

Прежде всего вместо

SELECT a.year, a.month, a.account_id, b.media_id , a.prdatt_id, a.prdatt_iid, a.prdatt_value , a.status 
    FROM ac_prd_tab_21 a, 
      dtl_monthly b 
    WHERE a.year= b.year AND a.month=b.month AND a.account_id=b.account_id 
UNION ALL 
    SELECT a.year, a.month, a.account_id, b.media_id , a.prdatt_id, a.prdatt_iid, a.prdatt_value , a.status 
    FROM ac_prd_tab_22 a, 
      dtl_monthly b 
    WHERE a.year= b.year AND a.month=b.month AND a.account_id=b.account_id 
     ... 

Я попробую

SELECT a.year, a.month, a.account_id, b.media_id , a.prdatt_id, a.prdatt_iid, a.prdatt_value , a.status 
    FROM (

    SELECT a.year, a.month, a.account_id, a.prdatt_id, a.prdatt_iid, a.prdatt_value , a.status 
    FROM ac_prd_tab_21 a 
UNION ALL 
    SELECT a.year, a.month, a.account_id, a.prdatt_id, a.prdatt_iid, a.prdatt_value , a.status 
    FROM ac_prd_tab_22 a 
     ) 
INNER JOIN dtl_monthly b 
     ON a.year= b.year AND a.month=b.month AND a.account_id=b.account_id 

Вторая вещь, я попытаюсь разбить запрос на несколько шагов, которые населяют реальные таблицы, может быть в порядке.

Третья вещь, если вы используете процедуру вместо того, чтобы вычислять каждый раз, когда значение util_pkg.fnc_get_Value() положить их в некоторых переменных, как vCR1 := util_pkg.fnc_get_Value('CR1'), то это:

nvl(decode(prdatt_id,util_pkg.fnc_get_Value('CR1') , prdatt_value, null),'00') 

станет это:

nvl(decode(prdatt_id, vCR1, prdatt_value, null),'00') 

Дополнительная мелкая вещь

(decode(prdatt_id, vCR1, nvl(prdatt_value, '00'), '00') 

Это должно быть e Нужно начать.

+2

+1 за то, что он даже бежит по нему. – Zane

+0

@ mucio ..thanks для ваших предложений ... fyi я попробовал запрос с max и его работает отлично .... Единственное, что я добавил в max, чтобы развернуть эти строки в cols. когда я пытаюсь запустить запрос tiwht ur предложения – UserKK