2014-10-21 8 views
0

OK ... поэтому я весь день разбираюсь в сводных командах и просто не могу справиться с этим.SQL 11g Pivot Tables

Следующий сценарий дает мне месяцы и год (MON-YYYY), перечисленные с даты начала компонента, до текущей даты для трех компонентов (P_CATNR).

select x.*, nrb.p_catnr, pd.catnr 
from 
    (select to_char(add_months(start_date, level-1),'Mon-YYYY') Month_from_NR 
    from (select (select min(selection_relse_date) 
        from [email protected]_to_cdsuk st 
         where substr(selection_no, 2, 99) = '2EDVD0017') start_date, sysdate end_date from dual) 
          connect by level <= months_between(trunc(end_date,'MM'), trunc(start_date,'MM'))+1) x, 
      part_description pd 
INNER JOIN inventory_purchase ip 
     ON ip.part_no = pd.part_no 
INNER JOIN scm_prodtyp pt 
     ON pt.prodtyp = pd.prodtyp 
INNER JOIN oes_fod_match acp 
     ON acp.part_no = pd.part_no 
INNER JOIN NCF_COMPPART ncf 
     ON ncf.item_part_no = pd.part_no 
INNER JOIN oes_nrbom nrb 
     ON ncf.catnr = nrb.c_catnr 
     AND ncf.prodtyp = nrb.c_prodtyp 
     AND ncf.packtyp = nrb.c_packtyp 
     AND ncf.vernr = nrb.c_vernr 
     WHERE pd.cunr in ('649830', 'W30000') 
     AND pd.catnr = '2EDVD0017' 
     AND pd.fod_idc = 'Y' 
     AND pt.prodgrp = 'AW' 

То, что я хотел бы сделать, это есть MONTH_FROM_NR перечислены в колонке, т.е.

enter image description here

Может кто-нибудь помочь, пожалуйста?

Благодаря

ответ

1
with t as (
select x.*, nrb.p_catnr, pd.catnr 
from 
    (select to_char(add_months(start_date, level-1),'Mon-YYYY') Month_from_NR 
    from (select (select min(selection_relse_date) 
        from [email protected]_to_cdsuk st 
         where substr(selection_no, 2, 99) = '2EDVD0017') start_date, sysdate end_date from dual) 
          connect by level <= months_between(trunc(end_date,'MM'), trunc(start_date,'MM'))+1) x, 
      part_description pd 
INNER JOIN inventory_purchase ip 
     ON ip.part_no = pd.part_no 
INNER JOIN scm_prodtyp pt 
     ON pt.prodtyp = pd.prodtyp 
INNER JOIN oes_fod_match acp 
     ON acp.part_no = pd.part_no 
INNER JOIN NCF_COMPPART ncf 
     ON ncf.item_part_no = pd.part_no 
INNER JOIN oes_nrbom nrb 
     ON ncf.catnr = nrb.c_catnr 
     AND ncf.prodtyp = nrb.c_prodtyp 
     AND ncf.packtyp = nrb.c_packtyp 
     AND ncf.vernr = nrb.c_vernr 
     WHERE pd.cunr in ('649830', 'W30000') 
     AND pd.catnr = '2EDVD0017' 
     AND pd.fod_idc = 'Y' 
     AND pt.prodgrp = 'AW' 
) 
select * from t pivot(
    max(catnr) catnr 
    for month_from_nr 
     in (to_date('10-2007', 'DD-YYYY') as d102007, to_date('11-2007', 'DD-YYYY') as d112007) 
); 

Вы увидите эти столбцы
p_catnr, catnr_d102007, catnr_d112007

Я использовал макс (catnr), потому что я не знаю природу колонки catnr

Вам нужно написать предложение IN вручную или вы можете использовать PIVOT XML. В этом случае вы можете использовать подзапросы в предложении IN, но запрос будет возвращать данные XML в этом случае

Примером PIVOT XML

with t as (
select 'James' name, '2010' dt_year, 100 salary from dual 
union all select 'James', '2011', 200 salary from dual 
union all select 'James', '2012', 300 salary from dual 
union all select 'Lisa', '2012', 450 salary from dual 
) 
select name, dt_year_xml from t pivot xml (
    sum(salary) sal for dt_year in (select distinct dt_year from t) 
); 
+0

Привет, это положение в установлении срока даты? могу ли я изменить дату, добавив оператор select для определения даты начала и использования sysdate (текущая дата) в качестве даты окончания? Я пытался ... в (to_date ((выберите мин (selection_relse_date) от BDS_SELECTION_ORG @ sid_to_cdsuk ул где зиЬзЬг (selection_no, 2, 99) = '2EDVD0017'), 'DD-YYYY'), как d102007, to_date (SYSDATE, 'DD-YYYY'), как d112007) ... но получил эту ошибку ... ORA-56901: непостоянная выражение не допускается для поворота | UNPIVOT значения – SMORF

+0

@SMORF в разделе определены столбцы , Я попытаюсь объяснить в ответе. Я уже написал в ответ, что вы не можете использовать подзапрос (= SELECT) в предложении IN. Если вы хотите использовать SELECT, вы должны использовать PIVOT XML вместо PIVOT, но результат будет не столбцами, а XML для каждой строки. – Multisync

+0

@SMORF Я добавил пример, как вы можете использовать SELECT внутри IN-раздела – Multisync