Sql server 如何摆脱空值表左外联接透视表

Sql server 如何摆脱空值表左外联接透视表,sql-server,Sql Server,我想在结果表中将这些空值设置为零。到目前为止,我找不到任何解决办法 A 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 ##Te

我想在结果表中将这些空值设置为零。到目前为止,我找不到任何解决办法

A

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)
将外部联接表A拆分为表轴:

select
 ##TempA.f_id  as [ID],
##TempPV.*          
from ##TempA
left outer join  ##TempPV
on  ##TempA.f_id = tmp_id
order by f_id
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)
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

您必须在主选择中使用coalesce或isnull。 我还添加了一个带有tempA和you5 id的左连接

查询:

您必须使用第二列列表,因为pivot只需要列名,并且您的选择必须如下:[30400]=coalesce[30400],0

输出:

数据:


您必须在主选择中使用coalesce或isnull。 我还添加了一个带有tempA和you5 id的左连接

查询:

您必须使用第二列列表,因为pivot只需要列名,并且您的选择必须如下:[30400]=coalesce[30400],0

输出:

数据:


不确定这是否有效,但我正在尝试构建查询C,并在其中动态添加列名,周围有一个ISNULL

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
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)

不确定这是否有效,但我正在尝试构建查询C,并在其中动态添加列名,周围有一个ISNULL

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
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)

由于Id的原因,当您使用Id加入它们时,我们会得到空值。sI必须包含来自TempA的所有记录。这就是为什么我必须显示来自TempA的所有Id。Id 4和5从何而来?假设TempA预先包含Id 1,2,3,4,5。所以您希望。。。选择TempA.f_id作为[id],ISNULLTempPV.[30100],0,等等?但是列名是动态的,例如,使用@cols?由于Id的原因,当您使用Id连接它们时,我们会得到null。sI必须包含来自TempA的所有记录。这就是为什么我必须显示来自TempA的所有Id。Id 4和5从何而来?假设TempA预先包含Id 1,2,3,4,5。所以您希望。。。选择TempA.f_id作为[id],ISNULLTempPV.[30100],0,等等?但是列名是动态的,例如使用@cols?非常感谢Julien!这是工作!:顺便问一下,有没有其他方法使Id 4和5显示为零,即使在Pivot Temp文件中找不到它们?因为我必须显示主表TempA中的所有Id。非常感谢Julien!这是工作!:顺便问一下,有没有其他方法使Id 4和5显示为零,即使在Pivot Temp文件中找不到它们?因为我必须显示主表TempA中的所有Id。非常感谢您!基于你的想法,我终于解决了我的问题;很高兴它有用:你应该强调你的最终解决方案是什么,以帮助他人,例如,创建一个新的答案,如果提供的答案没有一个是正确的,则标记为正确的。非常感谢!基于你的想法,我终于解决了我的问题;很高兴它有用:你应该强调你的最终解决方案是什么,以帮助他人,例如,创建一个新的答案,如果提供的答案没有一个按原样工作,则标记为正确。