Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将数据和空值连接到数据透视表_Sql_Oracle_Join_Pivot - Fatal编程技术网

Sql 将数据和空值连接到数据透视表

Sql 将数据和空值连接到数据透视表,sql,oracle,join,pivot,Sql,Oracle,Join,Pivot,在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

在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\u GR\u ST、O\u R\u LR\u FLT)可以按天数进行更深的拆分: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

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

您应该生成缺少的行。一个理想是:

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

然后在此查询上继续执行透视查询。

使用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; 

isnull
在oracle中不是有效的函数。您应该使用
nvl
coalesce
。锚查询中的
JOIN
在哪里?我在那里看不到任何
join
?Florin,我知道在Oracle中使用什么,这是SQL Server的一个示例,这就是nvl离开的原因,但问题仍然是一样的。Mahmoud,你想看到什么join?在我的X表中有一个案例,如果日差在0-1之间,则显示“0-1d”,否则显示“2-5d”。因此,如果没有显示某些时间段数据之间的记录(如RUD tail中没有示例,其中“0-1d”之间没有值,但我希望看到它是无的,并在其中看到0),谢谢!!这就是我真正需要的,不知何故没有考虑交叉连接:)只是对代码最后一行做了一些小的调整,应该是:days.days=orig.days,而不是a.days=orig.days作为a的输出,没有days变量