我通过数据透视表和动态列名生成表格。 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。
提前致谢。
答案 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
上的演示