sql server 2005版本及以上版本行转列函数

-- 创建表
IF OBJECT_ID('VrveisConfigKeyValue',N'U') IS NULL
BEGIN
    CREATE TABLE [dbo].[VrveisConfigKeyValue](
        [ID] [INT] IDENTITY(1,1) NOT NULL,
        [KeyName] [VARCHAR](100) NOT NULL,
        [KeyValue] [TEXT] NULL,
        [TypeName] [VARCHAR](100) NOT NULL,
        [UserID] [INT] NOT NULL,
        [ExField1] [INT] NULL,
        [ExField2] [INT] NULL,
        [Reserved1] [VARCHAR](500) NULL,
        [Reserved2] [VARCHAR](500) NULL,
    PRIMARY KEY CLUSTERED 
    (
        [ID] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
END
GO

 

103853_deUy_567785.png

 


 /*
 *
 *<参数化动态PIVOT行转列,带条件查询的参数化动态PIVOT行转列>
 *
 */ 
 
DECLARE @sql_str NVARCHAR(MAX)
 
DECLARE @sql_col NVARCHAR(MAX)
 
DECLARE @sql_where NVARCHAR(MAX)
 
DECLARE @tableName SYSNAME --行转列表
 
DECLARE @showColumns SYSNAME --显示列
 
DECLARE @pivotColumn SYSNAME --行变列的字段
 
DECLARE @pivotColumnValue SYSNAME --行变列值的字段(聚合函数使用)

DECLARE @groupTable SYSNAME -- 行变列列的查询表

DECLARE @groupWhere SYSNAME -- 行变列分组条件

SET @tableName = 'VrveisConfigKeyValue AS v LEFT JOIN dbo.Class AS c ON c.ClassID=v.ExField1'
 
SET @showColumns = 'v.ExField1 AS ClassID,v.KeyName,v.ExField2,c.ClassName'
 
SET @pivotColumn = 'KeyName'
 
SET @pivotColumnValue = 'ExField2'
 
SET @sql_where = 'WHERE v.TypeName=''ZJSELECTVALUE'' AND v.Reserved1=''201805'' '

 --从行数据中获取可能存在的列
SET @groupTable='VrveisConfigKeyValue'

SET @groupWhere='WHERE TypeName=''ZJSELECTVALUE'' AND Reserved1=''201805'' and KeyName <>''AQZSStatistics'' and KeyName<>''YJLYStatistics'' '

SET @sql_str = N'
SELECT @sql_col_out = ISNULL(@sql_col_out + '','','''') + QUOTENAME(['+@pivotColumn+'])
FROM ['+@groupTable+'] '+@groupWhere+' GROUP BY ['+@pivotColumn+']'
--PRINT @sql_str
 
EXEC sp_executesql @sql_str,N'@sql_col_out NVARCHAR(MAX) OUTPUT',@sql_col_out=@sql_col OUTPUT
--PRINT @sql_col  -- 打印行转列的列值

SET @sql_str = N'
  WITH TempDetail
  AS (
    SELECT '+@showColumns+' FROM '+@tableName+'  '+@sql_where+'
  )
  SELECT * FROM TempDetail PIVOT(MAX('+@pivotColumnValue+') FOR '+@pivotColumn+' IN ('+@sql_col+')) AS T 
'
-- PRINT (@sql_str)
EXEC (@sql_str)
 

 

104629_HXkb_567785.png

 

 

转载于:https://my.oschina.net/guanxinsui/blog/1809355

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值