根据SQL中的其他列设置列值

时间:2013-06-09 05:47:43

标签: sql-server dynamic-columns dynamic-pivot

我通过数据透视表和动态列名生成表格。 pivot的结果存储在临时表## 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.例如,在上面的情况中,在列1801.00&中。 2401.00(动态列)对于分别为00:15 - 00:30,00:00-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。

提前致谢。

1 个答案:

答案 0 :(得分: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

上的演示