创建 SQL 全局温度 Table,同时在日期范围之间动态旋转年份作为列
Create SQL Global Temp Table while Dynamically Pivoting Years between a Date Range as Columns
我如何更改下面的手动 DDL 脚本以动态创建 table?例如,我想为 2017 年和当前年份(2021 年)之间的每一年创建 2 列(注册年份和退出年份)并旋转它们。目前,该脚本将手动创建从 2017 年到 2021 年的列。我应该采取什么方向来使其动态化?
我正在考虑使用 while 循环来完成此操作,但我不太确定我是否在正确的轨道上或者是否有更好的方法。明年 2022 年,当脚本为 运行 时,它应该附加 [2022] 列。明年 2023 年脚本应附加 [2023] 列等。
DROP TABLE IF EXISTS ##Enrollment
CREATE TABLE ##Enrollment
(
[ID] VARCHAR(10),
[First_Name] VARCHAR(255) NULL ,
[Middle_Name] VARCHAR(255) NULL,
[Last_Name] VARCHAR(255) NULL,
[Date_of_Birth] DATE NULL,
[2017_Enrollment_Date] DATE NULL,
[2017_Disenrollment_Date] DATE NULL,
[2018_Enrollment_Date] DATE NULL,
[2018_Disenrollment_Date] DATE NULL,
[2019_Enrollment_Date] DATE NULL,
[2019_Disenrollment_Date] DATE NULL,
[2020_Enrollment_Date] DATE NULL,
[2020_Disenrollment_Date] DATE NULL,
[2021_Enrollment_Date] DATE NULL,
[2021_Disenrollment_Date] DATE NULL,
[Begin_Date] DATE NULL,
[End_Date] DATE NULL
)
一种方法是在最大值和最小值之间迭代数年,然后迭代动态列的 2 个可能名称
declare @minyear int = 2017
declare @maxyear int
declare @ddl varchar(max)
declare @i int = 0
if (@maxyear is null) select @maxyear=year(getdate())
drop table if exists ##Enrollment
set @ddl =
'CREATE TABLE ##Enrollment(
[ID] VARCHAR(10)
,[First_Name] VARCHAR (255) NULL
,[Middle_Name] VARCHAR (255) NULL
,[Last_Name] VARCHAR (255) NULL
,[Date_of_Birth] DATE NULL
,[Begin_Date] DATE NULL
,[End_Date] DATE NULL'
while @maxyear >= @minyear
begin
while @i <= 1
begin
set @ddl = @ddl + char(13) +
',[' + cast(@minyear as varchar(4)) + '_' + case when @i = 0 then 'En' else 'Disen' end + 'rollment_Date] DATE NULL'
set @i = @i + 1
end
set @minyear = @minyear + 1
set @i = 0
end
set @ddl = @ddl + char(13) + ')'
exec (@ddl)
如果您将值设置为 @maxyear
(例如在声明中,使用 declare @maxyear int = 2023
),您可以检查列达到 2023 年。
你可以测试这个db<>fiddle
我如何更改下面的手动 DDL 脚本以动态创建 table?例如,我想为 2017 年和当前年份(2021 年)之间的每一年创建 2 列(注册年份和退出年份)并旋转它们。目前,该脚本将手动创建从 2017 年到 2021 年的列。我应该采取什么方向来使其动态化?
我正在考虑使用 while 循环来完成此操作,但我不太确定我是否在正确的轨道上或者是否有更好的方法。明年 2022 年,当脚本为 运行 时,它应该附加 [2022] 列。明年 2023 年脚本应附加 [2023] 列等。
DROP TABLE IF EXISTS ##Enrollment
CREATE TABLE ##Enrollment
(
[ID] VARCHAR(10),
[First_Name] VARCHAR(255) NULL ,
[Middle_Name] VARCHAR(255) NULL,
[Last_Name] VARCHAR(255) NULL,
[Date_of_Birth] DATE NULL,
[2017_Enrollment_Date] DATE NULL,
[2017_Disenrollment_Date] DATE NULL,
[2018_Enrollment_Date] DATE NULL,
[2018_Disenrollment_Date] DATE NULL,
[2019_Enrollment_Date] DATE NULL,
[2019_Disenrollment_Date] DATE NULL,
[2020_Enrollment_Date] DATE NULL,
[2020_Disenrollment_Date] DATE NULL,
[2021_Enrollment_Date] DATE NULL,
[2021_Disenrollment_Date] DATE NULL,
[Begin_Date] DATE NULL,
[End_Date] DATE NULL
)
一种方法是在最大值和最小值之间迭代数年,然后迭代动态列的 2 个可能名称
declare @minyear int = 2017
declare @maxyear int
declare @ddl varchar(max)
declare @i int = 0
if (@maxyear is null) select @maxyear=year(getdate())
drop table if exists ##Enrollment
set @ddl =
'CREATE TABLE ##Enrollment(
[ID] VARCHAR(10)
,[First_Name] VARCHAR (255) NULL
,[Middle_Name] VARCHAR (255) NULL
,[Last_Name] VARCHAR (255) NULL
,[Date_of_Birth] DATE NULL
,[Begin_Date] DATE NULL
,[End_Date] DATE NULL'
while @maxyear >= @minyear
begin
while @i <= 1
begin
set @ddl = @ddl + char(13) +
',[' + cast(@minyear as varchar(4)) + '_' + case when @i = 0 then 'En' else 'Disen' end + 'rollment_Date] DATE NULL'
set @i = @i + 1
end
set @minyear = @minyear + 1
set @i = 0
end
set @ddl = @ddl + char(13) + ')'
exec (@ddl)
如果您将值设置为 @maxyear
(例如在声明中,使用 declare @maxyear int = 2023
),您可以检查列达到 2023 年。
你可以测试这个db<>fiddle