我有1960 - 2020年的GDP数据,每年存储为一列。为了解开这些列,我必须对所有年份(列)进行硬编码吗?
例如
国家名称 | 1960 | 1961 | 我们 | 200 | 400 | 加拿大道明>
---|---|---|
300 | 400 |
这是一种无需实际使用动态SQL就可以动态UNPIVOT数据的方法
示例或dbFiddle
Select A.[country name]
,B.*
From YourTable A
Cross Apply (
Select [Key]
,Value
From OpenJson((Select A.* For JSON Path,Without_Array_Wrapper ))
Where [Key] not in ('country name','OtherColums','ToExclude')
) B
结果
country name Key Value
US 1960 200
US 1961 400
CANADA 1960 300
CANADA 1961 400
看起来你主要是在问如何在这些年里循环。下面的代码应该可以做到。剩下要做的就是将这一声明与联枢枢纽声明结合起来,以充分解决问题。您可以在这里找到一个简洁的示例:https://learn.microsoft.com/en-us/sql/t-sql/queries/from-using-pivot-and-unpivot?view=sql-server-ver15
DECLARE @DynamicSQL VARCHAR(MAX)
DECLARE @yearStart INT = 1960
DECLARE @yearEnd INT = 2020
DECLARE @yearIterator INT = @yearStart
DECLARE @fieldPrefix String = 'GDP.[' --where GDP is the table you want to UNPIVOT
DECLARE @fieldSuffix String = ']'
SET @DynamicSQL = 'SELECT ' + @fieldPrefix
while 1=1
begin
SET @DynamicSQL = @DynamicSQL + @yearIterator + @fieldSuffix
if @yearIterator < @yearEnd
begin
SET @DynamicSQL = @DynamicSQL + ', '
end
SET @yearIterator = @yearIterator + 1
if @yearIterator > @yearEnd
begin
SET @DynamicSQL = @DynamicSQL + ' FROM GDP'
break
end
end
EXEC(@DynamicSQL)