t-sql - 创建需要多个参数的表值函数

标签 t-sql

我的 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

enter image description here

如果我的输入参数为 0,则期望的结果 enter image description here

最佳答案

如果没有动态 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/

相关文章:

sql - 转换失败 (SQL Server 2008)

sql - 计算一段时间内的返回数量

sql-server - Macbook 上的 TSQL "BULK INSERT"

SQL Server 2008 : PIVOT throwing an error 'The conversion of the varchar value ' xxx' overflowed an int column.'

sql - 使用 SQL Server 中的先前日期填充缺失的日期

sql-server - 如果您有索引 View ,为什么必须对整个数据库启用 QUOTED_IDENTIFIER?

sql-server - 在这种特定情况下,SQL Server 会一直短路吗?

如果另一个表中不存在对应的值,则 SQL 选择值

sql - 如何使此语句更快 : "paramDate Between startDate and NULL"?

sql-server - SQL Server : split a column value into two separate columns based on another column