2015-12-18 54 views
1

我想在結果表中將這些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)創建的動態柱樞軸表:左外連接表A至表樞軸

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

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 
+0

因爲標識的我們得到空當您正在使用的ID – mohan111

+0

加入他們,我必須包括## TEMPA的所有記錄。這就是爲什麼我必須顯示來自## TempA的所有Id。 –

+0

其中id 4和5來自哪裏? –

回答

1

你必須使用你的主SELECT COALESCE(或者ISNULL)。 我還添加了tempEF和LIDT JOIN 5個ID。

查詢:

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 

Data:

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

INSERT INTO #Temp1(tmp_id, tmp_ac, tmp_amt) values 
    (1, 30100, 100.00) 
    , (2, 30400, 300.00) 
    , (3, 30500, 500.00) 

CREATE TABLE #TempA(id varchar(8)); 
INSERT INTO #tempA(id) values (1), (2), (3), (4), (5); 
+0

非常感謝Julien!是工作! :)順便說一句,任何額外的方法,使Id「4」和「5」顯示零,即使他們沒有在數據透視臨時文件中找到?因爲我必須顯示主表中的所有ID(## TempA)。 –

+0

表A包含您的5個ID?使用FROM tempA LEFT JOIN temp1 ON ... –

-1

不知道這是否會工作或沒有,但我試圖建立查詢(C)和動態地與ISNULL()周圍添加的列名...

(C )LEFT OUTER JOIN表一表支點:

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

非常感謝Quantumplate!根據你的想法,我終於解決了我的問題。 ;) –

+0

很高興它很有用:)你應該強調你的最終解決方案是爲了幫助其他人,例如創建一個新的答案,並標記正確的,如果沒有提供的工作是。 – Quantumplate