2013-06-02 54 views
0

對所有人來說都是美好的日子/夜晚。 我是存儲過程的新手,我對存儲過程缺乏經驗和理解。我嘗試了其他教程和答案,但我不知道爲什麼我的查詢在使用isnull(付款,'0')或合併(付款,'0')時無法正常工作。SQL SERVER替換動態PIVOT中的空值

declare @sql as nvarchar(max) = '[2013-04-01],[2013-04-02],[2013-04-03],[2013-04-04],[2013-04-05],[2013-04-06]'; 
declare @name as nvarchar(max) = 'Derichel' 
set @sql = 
'SELECT pid, [Fullname], ' + @sql + ' 
FROM 
(SELECT pid, [Fullname], payment, dateregistration 
from tbl_Personal 
) AS s 
PIVOT 
(
min(payment) 
FOR dateregistration IN (' + @sql + ') 
) AS pvt 
where [Fullname] = ''' + @name + ''' 
order by pid' 
execute sp_executesql @sql; 

一些答案和教程在IN()中有固定的列。 我的@sql已被設置爲不同的日期(這取決於來自gui的用戶輸入)。

如何將空值替換爲0?

以上代碼的輸出是

pid Fullname [2013-04-01] [2013-04-02] [2013-04-03] [2013-04-04] [2013-04-05] [2013-04-06] 

6 Derichel  NULL   NULL   NULL   NULL  NULL   0 

我想更換空爲0

回答

1

你所得到的NULL值,因爲對於日期沒有行。當您嘗試在根查詢(SELECT ... FROM tbl_Personal)中包含ISNULL函數時,沒有什麼可修改的(該行不存在)。

作爲PIVOT操作的結果,NULL值出現,因此需要在數據旋轉後應用ISNULL。另一種看待它的方法是將ISNULL應用於最終結果的定義,這是第一個SELECT條款。

以下是沒有格式化動態數據透視查詢的SQL語句。

SELECT pid, [Fullname], 
    ISNULL([2013-04-01], 0) AS [2013-04-01], 
    ISNULL([2013-04-02], 0) AS [2013-04-02], 
    ISNULL([2013-04-03], 0) AS [2013-04-03], 
    ISNULL([2013-04-04], 0) AS [2013-04-04], 
    ISNULL([2013-04-05], 0) AS [2013-04-05], 
    ISNULL([2013-04-06], 0) AS [2013-04-06] 
FROM 
(SELECT pid, [Fullname], payment, dateregistration 
from tbl_Personal 
) AS s 
PIVOT 
(
min(payment) 
FOR dateregistration IN ([2013-04-01],[2013-04-02],[2013-04-03],[2013-04-04],[2013-04-05],[2013-04-06]) 
) AS pvt 
where [Fullname] = 'Derichel' 
order by pid 

對於動態查詢,您將無法在現在使用它的兩個地方使用@SQL變量。第一個實例將包含ISNULL函數調用,這在第二個實例中不允許(FOR dateregistration IN...)。

+0

如何更改IN()中的列,如果它有固定的列名稱? – Sephiroth111

+0

您仍然可以在構建@SQL變量中的SELECT子句時使用類似的技術,但需要使用不同的變量構造FOR ... IN子句。 – bobs