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 之外,所有这些列都是动态的。
现在的要求是将相邻 Column 的值更新为包含除 NULL 以外的值的列为 0。例如,在上述情况下,在 Column 1801.00 和 2401.00(它们是动态列)中设置了值分别为 00:15 - 00:30、00:30 - 00:45 和 02:00 - 02:15 的行。
此外,列 [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 回答