循环遍历 SQL 到 select 多年

Looping through columns SQL to select multiple years

我有 1960 - 2020 年的 GDP 数据,每一年都存储为一列。 为了取消对列的透视,我是否必须整年(列)都进行硬编码?

例如

country name 1960 1961
US 200 400
CANADA 300 400

需要(逆轴)

countryname value Year
US 200 1960
US 400 1961
CANADA 300 1960
CANADA 400 1961

但是对于 1960-2020 年这样做,是否有必要在我的 unpivot 语句中说明每年的列?

我正在尝试使用动态查询,在一开始,我有

DECLARE @DynamicSQL VARCHAR(MAX)
DECLARE @year INT = 1960


SET @DynamicSQL = 'SELECT GDP.[' + CAST(@year AS VARCHAR(10)) +'] FROM GDP'


EXEC(@DynamicSQL)

但是我怎样才能增加 1 年并在一个 SET 语句中添加年份列表?

谢谢!

看来你主要问的是如何循环年月。下面的代码应该可以做到。剩下的就是结合 UNPIVOT 语句使用它来完全解决问题。你可以在这里找到一个简洁的例子:https://docs.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)

这是一种无需实际使用 Dynamic 即可动态反透视数据的方法 SQL

示例或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