从Pivot对动态列执行操作

时间:2018-01-03 13:58:15

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

正如问题所说,我试图使用Pivot将动态sql Query中的某些值插入TempTable,因此我不知道ExistingCoulmnName

在下一步中,我想执行一些算术运算,让我们说这些列值的乘法。

我该怎么做?

附加一些样品:

select @cols = STUFF((SELECT ',' + QUOTENAME(FYYear) 
                from #TempCapEx
                group by FYYear
                order by FYYear
        FOR XML PATH(''), TYPE
        ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'') 

set @query = 'SELECT CapitalExpenditureId,' + @cols + ' into  
         ##GlobalTempForCapExPivotResult from 
         (
            select CapitalExpenditureId, FYYear, indicatorvalue
            from #TempCapEx
        ) x
        pivot 
        (
            sum(indicatorvalue)
            for FYYear in (' + @cols + ')
        ) p'

execute (@query ) ;

所以我有一个##GlobalTempForCapExPivotResult

CapitalExpenditureId    2016-2017   2017-2018   2018-2019   2019-2020   2020-2021   2021-2022   2022-2023
22150                   0.0000      35200.0000  35200.0000  35200.0000  35200.0000  35200.0000  NULL
32632                   NULL        213695.0000 224379.0000 235599.0000 247379.0000 259748.0000 0.0000
1589                    10252.0000  170370.0000 0.0000      0.0000      0.0000      0.0000      NULL
14988                   0.0000      133000.0000 0.0000      0.0000      0.0000      0.0000      NULL
36877                   NULL        303.0300    404.040     101.010     0.0000      0.0000      0.0000

因此财务年度专栏可能会增加或减少,所以我该如何做这样的事情:

Select [ExistingCoulmnName] * 3.5 from #GlobalTempForCapExPivotResult where [ExistingCoulmnName] = '[2016-2017]'

预期产出:

CapitalExpenditureId    2016-2017   2017-2018        2018-2019          2019-2020         2020-2021        2021-2022        2022-2023
22150                   0.00 * 3.5  35200.0000 * 3.5 35200.0000 * 3.5  35200.0000 * 3.5  35200.0000 * 3.5 35200.0000 * 3.5  NULL * 3.5

2 个答案:

答案 0 :(得分:1)

在标准SQL语句中没有本机方法可以做到这一点。相反,您使用某种语言(可能甚至是T-SQL)将新查询写入字符串,然后执行该新查询。与你的例子大致相同。

DECLARE @field NVARCHAR(256) = N'2015-2016';

DECLARE @dynamicSelect NVARCHAR(MAX);

SET @dynamicSelect = N'SELECT *, 3.5 * [' + @field + N'] AS new_field FROM ##GlobalTempForCapExPivotResult';

EXECUTE(@dynamicSelect);

另请注意,此类问题是 为什么 您不应该首先创建该全局临时表。规范化的数据结构对SQL更友好。执行SQL格式 格式。

这是没有全局临时表的查询...

SELECT
  CapitalExpenditureId,
  FYYear,
  indicatorvalue * 3.5
FROM
  #TempCapEx
GROUP BY
  CapitalExpenditureId,
  FYYear
ORDER BY
  CapitalExpenditureId,
  FYYear

作为一个人可能更喜欢平面文件(excel style)表,但这是一个非常糟糕的主意在SQL中使用的表的类型。坚持规范化的数据结构,并学习如何使用它们。不要试图打破SQL。

答案 1 :(得分:0)

您需要创建动态UPDATE语句:

DECLARE
    @UPDATEList NVARCHAR(MAX) = N''
    , @DynamicSQL NVARCHAR(MAX) = N'UPDATE ##GlobalTempForCapExPivotResult
SET ';

SELECT @UPDATEList += N'
    , '
    + QUOTENAME(FYYear) + N' = ' + QUOTENAME(FYYear) + N' * 3.5'
FROM #TempCapEx
GROUP BY FYYear;

SELECT @UPDATEList = SUBSTRING(@UPDATEList, 6, LEN(@UPDATEList) - 5);
SELECT @DynamicSQL += @UPDATEList + ';';

EXEC (@DynamicSQL);

更新全局临时表。