我有一个存储过程,它从一个表中获取数据,运行我的动态数据透视存储过程,然后输出到页面中。问题是,有大量的空条目。当我在页面上处理这些数据时,我需要添加每个 TerminalID 的每个燃料数量。当它遇到空条目时会出现问题。我不想让程序读取每一行和每一列以将 null 转换为 0,并且希望在 SP 中这样做。
对于测试,我制作了这个脚本:
DECLARE @QUERY NVARCHAR(MAX)
, @Soucecolumn VARCHAR(MAX)
, @BeginningDate VARCHAR(MAX)
, @EndingDate VARCHAR(MAX)
, @CompanyID VARCHAR(2)
SET NOCOUNT ON;
SET @BeginningDate = CONVERT(VARCHAR(30), CAST('2004-01-01' AS DATE));
SET @EndingDate = CONVERT(VARCHAR(30), CAST('2007-01-01' AS DATE));
SET @CompanyID = CONVERT(INT, '2');
SET @Soucecolumn = STUFF((
SELECT DISTINCT ', \[' + CAST(FuelTypeID AS VARCHAR(4)) + '\]'
FROM tt_Manifest_Fuel_Distribution
FOR XML PATH ('')), 1, 1, '')
SET @QUERY = '(
SELECT ManifestID, TerminalID, ' + @Soucecolumn + '
FROM (
SELECT mfd.ManifestID, m.TerminalID, mfd.FuelTypeID, mfd.FuelQuantity
FROM tt_Manifest_Fuel_Distribution mfd, tt_Terminals t, tt_Fuel_Types ft, tt_Manifests m
WHERE mfd.FuelTypeID=ft.FuelTypeID
AND m.ManifestID=mfd.ManifestID
AND m.CompanyID= ' + @CompanyID + '
AND m.ManifestInsertDate BETWEEN ''' + @BeginningDate + ''' AND ''' + @EndingDate +
'''
) up
PIVOT (
MAX(FuelQuantity) FOR \[FuelTypeID\] IN (' + @Soucecolumn + ')
) AS pvt)'
EXEC sp_executesql @QUERY
样本数据为:
>ManifestID TerminalID 3 6 4 2 1 5
>417 1 NULL NULL NULL NULL NULL 2478
>421 1 NULL NULL NULL NULL 3458 NULL
>508 1 NULL NULL NULL NULL NULL 2471
>826 1 NULL NULL NULL NULL NULL 7464
>832 1 NULL NULL NULL NULL 3482 NULL
>833 1 1001 NULL NULL NULL 1492 NULL
>844 1 NULL NULL NULL NULL 2498 NULL
>870 1 NULL NULL NULL NULL 5991 2503
>872 1 NULL NULL NULL NULL 3494 NULL
>2 2 NULL NULL 5514 NULL NULL 2505
>43 2 NULL NULL NULL NULL 7011 NULL
>46 2 1005 NULL NULL NULL 5007 2510
>60 2 NULL NULL 3502 NULL NULL 4513
>63 2 NULL NULL 4505 NULL NULL 3008
>69 2 NULL NULL 4008 NULL 4508 NULL
>78 2 1007 NULL NULL NULL 5022 NULL
>79 2 NULL NULL 2505 NULL NULL NULL
我尝试在 mfd.FuelQuantity 和 @Sourcecolumn 周围放置 ISNULL(,0)。mfd.FuelQuantiity 似乎没有变化,而 @Sourcecolumn 错误地声称 ISNull() 需要 2 个参数。
我是否以错误的方式看待这个问题?