Sql 将数据和空值连接到数据透视表
在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
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变量