循环遍历 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
我有 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