循环通过列SQL选择多个年份



我有1960 - 2020年的GDP数据,每年存储为一列。为了解开这些列,我必须对所有年份(列)进行硬编码吗?

例如

tbody> <<tr>加拿大道明><</td>
国家名称19601961
我们200400
300400

这是一种无需实际使用动态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)

相关内容

  • 没有找到相关文章

最新更新