正如问题所说,我试图使用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
答案 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);
更新全局临时表。