将缺少的行添加到结果集

时间:2017-11-04 00:36:52

标签: sql-server tsql sql-server-2014

我小时前问过类似的问题。 Previous Question

这次情况不同

我有一个事实和昏暗的表。比较上一个问题,我的事实表有一个额外的字段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')

使用以下查询

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  

您会看到结果中缺少标题。例如,我没有第一组'AF'和'AL'('HFI'设置),'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 个答案:

答案 0 :(得分:1)

如果previous suggestion适合你,那么你可以通过将结果与fact表一起加入来做类似的事情,并使用coalesce替换 null 金额为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