2015-10-13 44 views
1

SQL几乎没有问题。我想要做的是计算不同的状态并将其显示为数据透视表。代码:将数据加入数据透视表并将空值数据加入

SELECT TAIL_NO, 
     isnull(pt.A_GR_ST,0) as A_GR_ST, 
     isnull(pt.O_R_LR_FLTS,0) 
FROM (select distinct 
       X."Tail_#" as TAIL_NO, 
       COUNT(*) as qty, 
       X.statuss 
     FROM X 
     group by X.Tail_#, X.statuss) p  
PIVOT 
(
    MAX([qty]) 
    FOR [statuss] In([A_GR_ST], [O_R_LR_FLTS]) 
) As pt 
order by TAIL_NO 

完美的作品对我来说并给出输出:

TAIL_NO A_GR_ST O_R_LR_FLTS 
--------- --------- ------------- 
RUD  0   1 
EW  7   2 
ED  100  10 

每个状态号(A_GR_ST,O_R_LR_FLTS)可以通过更深层次的天数进行分割:0-1D,2-5d 我想要做的就是将这些日子拆分成现有的数据透视表来查看按日计算的拆分状态结果,如果没有日子,我必须在表格中看到零。输出应该是这样的:

TAIL_NO DAYS A_GR_ST O_R_LR_FLTS 
--------- ------- --------- ------------- 
RUD  0-1d 0   0 
RUD  2-5d 0   1 
EW  0-1d 7   2 
EW  2-5d 0   0 
ED  0-1d 40  3 
ED  2-5d 60  7 

怎么办?预先感谢您。

当我使用代码:

SELECT TAIL_NO, 
     days, 
     isnull(pt.A_GR_ST,0) as A_GR_ST, 
     isnull(pt.O_R_LR_FLTS,0) 
FROM (select distinct 
       X."Tail_#" as TAIL_NO, 
       COUNT(*) as qty, 
       X.statuss, 
       X.days 
     FROM X 
     group by X.Tail_#, X.statuss, X.days) p 
PIVOT 
(
    MAX([qty]) 
    FOR [statuss] In([A_GR_ST], [O_R_LR_FLTS]) 
) As pt 
order by TAIL_NO 

我得到的输出:

TAIL_NO DAYS A_GR_ST O_R_LR_FLTS 
--------- ------- --------- ------------- 
RUD  2-5d 0   1 
EW  0-1d 7   2 
ED  0-1d 40  3 
ED  2-5d 60  7 

不包括零线。我需要拥有它们。

+0

'isnull'不是Oracle中的有效功能。你应该使用'nvl'或'coalesce'。 –

+0

锚定查询中的JOIN在哪里?我在那里看不到任何'join'? –

+0

弗洛林,我知道在Oracle中使用什么,这里是一个来自SQL Server的示例,这是为什么nvl离开,但问题仍然是一样的。 – orangutangas

回答

1

您应该生成缺失的行。一个ideea将是:

select 
    a.tail_no, 
    a.statuss, 
    days.days 
    nvl(orig.qty, 0) as qty 
from 
    (SELECT 
     X."Tail_#" as TAIL_NO, X.statuss 
    FROM X 
    GROUP BY X.Tail_#, X.statuss 
    )a 
    cross join (select distinct days from x) days 
    left join (
     SELECT 
      X."Tail_#" as TAIL_NO, 
      X.statuss, 
      X.days, 
      COUNT(*) as qty 
     FROM X 
     GROUP BY X.Tail_#, X.statuss, X.days 
     ) orig 
     ON a.tail_no = orig.tail_no and a.statuss=orig.statuss and a.days=orig.days 

然后继续对此查询进行数据透视查询。

+1

THANK您!!这就是我真正需要的,不知怎的,没有想到关于交叉加入:)只是代码最后一行的小调整应该是:days.days = orig.days,而不是a.days = orig.days作为A的输出,没有天变量 – orangutangas

+0

是的,你是对的天。 –

1

使用CTE并通过执行一些连接,这样就可以实现:

with table_main as (
     SELECT TAIL_NO, DAYS, pt.A_GR_ST, pt.O_R_LR_FLTS 
     FROM (select distinct 
         X."Tail_#" as TAIL_NO, 
         COUNT(*) as qty, 
         X.statuss, 
         X.DAYS as DAYS 
         FROM X 
        group by X.Tail_#,X.statuss,X.days) p 

       PIVOT 
       (
        MAX([qty]) 
        FOR [statuss] In([A_GR_ST], [O_R_LR_FLTS]) 
        ) As pt 
        order by TAIL_NO), 
table_days as (select d.days, t.tail_no from (
        (select '0-1d' as days union all 
        select '2-5d') d 
       cross join (select distinct TAIL_NO from table_main) t)) 
select td.DAYS, td.TAIL_NO, isnull(tm.A_GR_ST, 0), isnull(tm.O_R_LR_FLTS, 0) 
    from table_days td 
    left outer join table_main tm 
    on tm.DAYS = td.days and tm.TAIL_NO = td.TAIL_NO; 
+0

谢谢,但第一个回复对我来说工作得很好 – orangutangas