SQL11G数据透视表

SQL11G数据透视表,sql,oracle11g,Sql,Oracle11g,好的。。。所以我整天都在试图理解pivot命令,但就是无法掌握它 下面的脚本给出了3个组件p_CATNR从组件开始日期到当前日期的MON-YYYY月和年 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)

好的。。。所以我整天都在试图理解pivot命令,但就是无法掌握它

下面的脚本给出了3个组件p_CATNR从组件开始日期到当前日期的MON-YYYY月和年

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 BDS_SELECTION_ORG@sid_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'
我想做的是每列列出的月份,即

有人能帮忙吗


谢谢

您好,IN子句是否设置了日期期限?我可以通过添加select语句来定义开始日期并使用sysdate current date作为结束日期来更改日期周期吗?我试过。。。在to_date中选择minselection,从BDS中选择relse_date_ORG@sid_to_cdsukst,其中子选择编号2,99='2EDV0017','DD-YYYY'为d102007,至'DD-YYYY'为d112007。。。但是我犯了这个错误。。。ORA-56901:pivot | unpivot不允许使用非常量表达式values@SMORF在子句定义列中,我将尝试在答案中进行解释。我已经在答案中写道,您不能在in子句中使用subquery=SELECT。如果要使用SELECT,应该使用PIVOT XML而不是PIVOT,但结果不是列,而是每行的XML。@SMORF我在子句OK中添加了如何在内部使用SELECT的示例,最后单击了它!非常感谢你的解释和耐心。
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 BDS_SELECTION_ORG@sid_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)
);
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)
);