我的 t-sql 代码需要一些帮助。背景我有一个表,按年份按列输出数据。所以单行将有 CN[Year 0]........CN[Year 10]、Premiums[Year 0]......[Year 10] 等等。我正在尝试编写一个函数它接受一个整数参数,然后仅返回指定年份列的表,即 CN、Premium 等。最终我想在某个时候连接这些表。我有手动运行代码的基础知识,但不确定如何自动化我的函数,以便它可以返回表。
目前我可以运行其中的代码 - - - 从这里 - - - 到这里 手动但不自动执行代码,以便它可以返回表格
CREATE FUNCTION [xxxxxxx_Price_Schema].get_MultiYear(@year varchar(1))
RETURNS TABLE
AS
RETURN
------from here
declare @year varchar(1);
declare @yearNo varchar(1);
declare @customerNo varchar(25);
declare @CN varchar(3);
declare @SQLString NVARCHAR(max);
declare @SQLResult nvarchar(max);
set @year = 1
set @yearNo = cast(@year as varchar(1))
set @customerNo = QUOTENAME(cast('CustomerNumber[Year '+ @yearNo + ']' as varchar(25)))
set @CN = concat('CN',@yearNo)
set @SQLString =
'
select distinct
[CN[Year '+ @yearNo +']]] AS CN
,[Premium[Year '+ @yearNo + ']]] AS Premium
,[Age[Year '+ @yearNo + ']]] AS Age
,[Sex[Year '+ @yearNo + ']]] AS Sex
FROM [Test].[Test202002].[PHL_MultiYear_Test_Output]
WHERE ' + @customerNo + ' = '''+ @CN + '''
'
EXECUTE sp_executesql @SQLString
----too here
RETURN @SQLString
END
GO
最佳答案
如果没有动态 SQL,您将无法获取动态列名称。但是,如果您不介意标准化结果,请考虑对数据进行 UNPIVOT
这可以轻松地合并到表值函数中。
示例 dbFiddle
Declare @Year varchar(1) = '0'
Select SelYear = @Year
,CN = max(case when Item like 'CN%' then Value end)
,Premium = max(case when Item like 'Premium%' then Value end)
From (
Select *
From (Select *
,RN=Row_NUmber() over (Order by (Select null))
From YourTable
Where 1=1 -->>> Put your actual WHERE here <<<--
) src
Unpivot ( Value for Item in ([CN [Year 0]]],[CN [Year 1]]],[Premium [Year 0]]],[Premium [Year 1]]] )) unp -->>> Add 2 through 5 <<<--
Where Item like '%'+@Year+']'
) A
Group By RN
返回
SelYear CN Premium
0 0 10
0 0 20
0 0 30
0 0 40
更新了奇数列名称 dbFiddle
编辑 #2 - 变量数据类型
Select SelYear = @Year
,CN = max(case when Item like 'CN%' then Value end)
,Premium = max(case when Item like 'Premium%' then Value end)
From (
Select *
From (Select *
,RN=Row_NUmber() over (Order by (Select null))
From YourTable
Where 1=1 -->>> Put your actual WHERE here <<<--
) src
Cross Apply ( values ('CN [Year 0]' ,convert(varchar(50),[CN [Year 0]]]) )
,('CN [Year 1]' ,convert(varchar(50),[CN [Year 1]]]) )
,('Premium [Year 0]',convert(varchar(50),[Premium [Year 0]]]) )
,('Premium [Year 1]',convert(varchar(50),[Premium [Year 0]]]) )
)B(Item,Value)
Where Item like '%'+@Year+']'
) A
Group By RN
关于t-sql - 创建需要多个参数的表值函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56149098/