2017-11-04 100 views
2

小时前我问了类似的问题。 Previous Question将缺失的行添加到结果集中

这一次情况不同了

我有一个事实和维度表。前面的问题相比,我的事实表中有使用下面的查询

select #fact.SKey, #fact.HT, #fact.TitleId, #dim.Title, #fact.Amount 
from #fact 
    inner join #dim on #dim.TitleId = #fact.TitleId 
order by #fact.SKey, #fact.HT, #fact.TitleId, #dim.Title 

返回我下面的数据

SKey HT TitleId Title Amount 
-------- ----- --------- ------- ---------- 
    201707 HFI   1 UK  15000.00 
    201707 HFI   3 LQ  16000.00 
    201707 HFI   5 GT  17000.00 
    201707 HFI   6 ML  18000.00 
    201707 REO   1 UK  19000.00 
    201707 REO   2 AF  20000.00 
    201707 REO   4 AL  21000.00 
    201707 REO   5 GT  22000.00 

你看有缺失的标题中所谓Amount

create table #fact (SKey int, HT varchar(5), TitleId int, Amount decimal(15,2)) 

insert into #fact values 
(201707, 'HFI', 1, 15000), 
(201707, 'HFI', 3, 16000), 
(201707, 'HFI', 5, 17000), 
(201707, 'HFI', 6, 18000), 
(201707, 'REO', 1, 19000), 
(201707, 'REO', 2, 20000), 
(201707, 'REO', 4, 21000), 
(201707, 'REO', 5, 22000) 

create table #dim (TitleId int, Title varchar(10)) 
insert into #dim values 
(1, 'UK'), 
(2, 'AF'), 
(3, 'LQ'), 
(4, 'AL'), 
(5, 'GT'), 
(6, 'ML') 

一个额外的字段结果。例如,第一组('HFI'组)没有'AF'和'AL','REO'部分没有'LQ'和'ML'。

总之我会产生以下结果:

SKey HT TitleId Title Amount 
-------- ----- --------- ------- ---------- 
    201707 HFI   1 UK  15000.00 
    201707 HFI   2 AF   0.00 -- missing from first result 
    201707 HFI   3 LQ  16000.00 
    201707 HFI   4 AL   0.00 -- missing from first result 
    201707 HFI   5 GT  17000.00 
    201707 HFI   6 ML  18000.00 
    201707 REO   1 UK  19000.00 
    201707 REO   2 AF  20000.00 
    201707 REO   3 LQ   0.00 -- missing from first result 
    201707 REO   4 AL  21000.00 
    201707 REO   5 GT  22000.00 
    201707 REO   6 ML   0.00 -- missing from first result 

失踪行我想告诉Amound为0.00

目前,我的第一个结果存储到一个临时表,然后使用循环/光标将缺失的行添加到int中。

有什么办法我们只使用一个查询来获得最终结果?

回答

1

如果previous suggestion为你工作,那么你可以做的加入,结果回来的fact表类似的东西,并用​​3210更换金额以0:

;with f as (
    select SKey, HT from fact 
    group by SKey, HT 
), combns as (
    select f.SKey, f.HT, dim.TitleId, dim.Title 
    from f, dim 
) 
select combns.*, coalesce(fact.Amount, 0) as Amount 
from combns 
left join fact 
on combns.SKey=fact.SKey and 
    combns.HT=fact.HT and 
    combns.TitleId=fact.TitleId 

fiddle here

+0

工作很好。再次感谢。 – FLICKER