1 つのテーブルからデータを取得し、動的ピボット ストアド プロシージャを実行して、ページに出力するストアド プロシージャがあります。問題は、かなりの数の null エントリがあることです。ページでこのデータを処理するとき、TerminalID ごとに燃料の量をそれぞれ追加する必要があります。この問題は、null エントリにヒットしたときに発生します。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 つの引数が必要であると主張してエラーを出しました。
私はこれを間違った方法で見ていますか?