2

動的列名を使用してピボット テーブルを介して生成されたテーブルがあります。ピボットの結果は、一時テーブル ##MyTable に格納されます。

サンプル列とデータを含む ##MyTable の構造は次のとおりです。

dFrom    dTo   0    1800.00    1801.00    2400.00    2401.00    20000.00  
00:15    00:30 NULL 2.1        NULL       NULL       NULL       0  
00:30    00:45 NULL 2.1        NULL       NULL       NULL       0  
.  
.  
.  
02:00    02:15 NULL NULL       NULL       3.5        NULL       0  

dFrom、dTo、0、および 20000.00 を除くこれらの列はすべて動的です。
ここで、NULL 以外の値を含む列に隣接する列の値を 0 に更新する必要があります。たとえば、上記の場合、列 1801.00 & 2401.00 (動的な列) に値が設定されます。それぞれ 00:15 ~ 00:30、00:30 ~ 00:45、および 02:00 ~ 02:15 の行の場合は 0 にします。
また、列 [0] には、NULL 以外の値を含む列と同じ値が含まれている必要があります。上記の場合と同様に、00:15 - 00:30 & 00:30 - 00:45 の行の場合、列 [0] には 2.1 が含まれている必要があります。02:00 ~ 02:15 の行の場合、列 [0] には 3.5 が含まれている必要があります。

前もって感謝します。

4

1 に答える 1

2

NULL を 0 に置き換えたい列については、ISNULL関数を使用します。

ISNULL(dynamicColumn1, 0)

列 [0] には、COALESCE関数を使用できます。

COALESCE(dynamicColumn1, dynamicColumn2, etc)

動的ステートメント

DECLARE @PivotColumnHeadersForSelect varchar(max),
        @PivotColumnHeadersForPivot varchar(max)
SELECT @PivotColumnHeadersForSelect = 
  COALESCE(@PivotColumnHeadersForSelect + CASE WHEN [mPriceKW] = 0.00 THEN '[0.00]' ELSE ',ISNULL([' 
  + CAST([mPriceKW] as varchar(10)) + '], 0.0) AS [' + CAST([mPriceKW] as varchar(10)) + ']' END, 
  + CASE WHEN [mPriceKW] = 0.00 THEN '[0.00]' ELSE 'ISNULL([' + CAST([mPriceKW] as varchar(10)) 
  + '], 0.0) AS [' + CAST([mPriceKW] as varchar(10)) + ']' END),
       @PivotColumnHeadersForPivot =
  COALESCE(@PivotColumnHeadersForPivot + ',[' + CAST([mPriceKW] as varchar(10)) + ']', 
  + '[' + CAST([mPriceKW] as varchar(10)) + ']')      
FROM PivotColumn
GROUP BY [mPriceKW]
ORDER BY [mPriceKW] ASC

SET @PivotColumnHeadersForSelect = 
  REPLACE(@PivotColumnHeadersForSelect, '[0.00]', 'COALESCE(' + @PivotColumnHeadersForPivot + ') AS [0.00]')
--SELECT @PivotColumnHeadersForSelect, @PivotColumnHeadersForPivot

DECLARE @PivotTableSQL NVARCHAR(MAX) 
SET @PivotTableSQL = N' 
IF OBJECT_ID(''tempdb.dbo.##MyTable'') IS NOT NULL DROP TABLE dbo.##MyTable
SELECT * 
INTO dbo.##MyTable
FROM (SELECT dFrom, dTo, ' + @PivotColumnHeadersForSelect + '
      FROM (
            SELECT a.dFrom, a.dTo ,a.[mPriceKW] , a.fQuantumMW 
            FROM PivotColumn a 
            WHERE a.iBid = 1 
             ) TableDate 
PIVOT (min(fQuantumMW) FOR [mPriceKW] IN (' + @PivotColumnHeadersForPivot + ') 
      ) PivotTable) dt ' 
--PRINT @PivotTableSQL      
EXECUTE(@PivotTableSQL)

SELECT *
FROM ##MyTable

SQLfiddle のデモも参照してください

于 2013-06-09T06:51:00.603 に答える