如何摆脱空值表左外连接数据透视表

时间:2015-12-18 08:44:32

标签: sql-server

我想在结果表中将这些NULL值设置为零。到目前为止,我无法找到任何解决方案。

(A)

CREATE TABLE ##Temp1
 (
    tmp_id varchar(8),
    tmp_ac varchar(5),
    tmp_amt decimal(15,2)
 )

Record :
id   ac      amt
1    30100   100.00
2    30400   300.00
3    30500   500.00

(B)创建动态列数据透视表:

declare @cols as varchar(max)
declare @query as varchar(max)

select @cols = ISNULL(@cols + ',','') + '[' + tmp_ac + ']' from ##Temp1 order by tmp_ac 

set @query = 'select tmp_id, '+ @cols + ' into ##TempPV from 
              (
                  select tmp_id, tmp_ac, isnull(tmp_amt,0) as tmp_amt
                  from ##Temp1
              ) x
              pivot
              (
                 sum(tmp_amt)
                  for tmp_ac in (' + @cols + ')
              ) p'
exec (@query)

(C)左外连接表A到表轴:

select
 ##TempA.f_id  as [ID],
##TempPV.*          
from ##TempA
left outer join  ##TempPV
on  ##TempA.f_id = tmp_id
order by f_id

(D)结果:

Id   30100    30400    30500
1    100.00   NULL     NULL
2    NULL     300.00   NULL
3    NULL     NULL     500.00
4    NULL     NULL     NULL
5    NULL     NULL     NULL

(E)期待结果:

Id   30100    30400    30500
1    100.00   0.00     0.00
2    0.00     300.00   0.00
3    0.00     0.00     500.00
4    0.00     0.00     0.00
5    0.00     0.00     0.00

2 个答案:

答案 0 :(得分:1)

您必须在主SELECT中使用coalesce(或isnull)。 我还添加了一个带有tempA的LEFT JOIN和5个ID。

<强>查询:

ul.mealboxes {
 list-style: none;
}

您必须使用第二列列表,因为数据透视表只需要列名称,而您的SELECT必须如下:declare @col_null as varchar(max) declare @cols as varchar(max) declare @query as varchar(max) select @col_null = ISNULL(@col_null + ',','') + ' ['+tmp_ac+ '] = coalesce([' + tmp_ac + '], 0)' from #Temp1 order by tmp_ac select @cols = ISNULL(@cols + ',','') + ' [' + tmp_ac + ']' from #Temp1 order by tmp_ac set @query = 'select id, '+ @col_null + ' /*into #TempPV*/ from ( select id, tmp_ac, isnull(tmp_amt,0) as tmp_amt from #tempA ta LEFT JOIN #Temp1 t1 ON ta.id = t1.tmp_id ) x pivot ( sum(tmp_amt) for tmp_ac in (' + @cols + ') ) p'

<强>输出:

[30400] = coalesce([30400], 0)

数据:

id  30100   30400   30500
1   100.00  0.00    0.00
2   0.00    300.00  0.00
3   0.00    0.00    500.00
4   0.00    0.00    0.00
5   0.00    0.00    0.00

答案 1 :(得分:-1)

不确定这是否可行但是我正在尝试构建查询(C)并使用ISNULL()围绕它们动态添加列名...

(C)左外连接表A到表轴:

declare @cols2 as varchar(max)
select @cols2 = ISNULL(@cols2 + ',','') + 'ISNULL(##TempPV.[' + tmp_ac + '], 0) as [' + tmp_ac + ']' from ##Temp1 order by tmp_ac 

set @query2 = 'select
               ##TempA.f_id  as [ID],
               ' + @cols2 + '          
               from ##TempA
               left outer join  ##TempPV
               on  ##TempA.f_id = tmp_id
               order by f_id'

exec (@query2)