我有 1960 - 2020 年的 GDP 資料,每年都存盤為一列。為了取消透視列,我是否必須全年硬編碼(列)?
例如
| 國家的名字 | 1960 | 1961年 |
|---|---|---|
| 我們 | 200 | 400 |
| 加拿大 | 300 | 400 |
期望的(非樞軸)
| 國家的名字 | 價值 | 年 |
|---|---|---|
| 我們 | 200 | 1960 |
| 我們 | 400 | 1961年 |
| 加拿大 | 300 | 1960 |
| 加拿大 | 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 陳述句中添加年份串列?
謝謝!
uj5u.com熱心網友回復:
這是一種無需實際使用動態 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
uj5u.com熱心網友回復:
似乎您主要是在問如何回圈這些年。下面的代碼應該做到這一點。剩下的就是將它與 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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/479237.html
