sql server(PIVOT) 行列转换

1.创建表脚本

 

if exists (select 1

            from  sysobjects

           where  id = object_id('Insurances')

            and   type = 'U')

   drop table Insurances

go

 

/*==============================================================*/

/* Table: Insurances                                            */

/*==============================================================*/

create table Insurances (

   RefID                uniqueidentifier     not null,

   HRMS                 nvarchar(20)         null,

   Name                 nvarchar(20)         null,

   InsuranceMoney       money                null,

   InsuranceName        nvarchar(100)        not null,

   constraint PK_INSURANCES primary key (RefID)

)

go

 

 

2.测试数据脚本

 

insert into Insurances values (newid(),1,'张三',200,'养老保险')

insert into Insurances values (newid(),1,'张三',300,'医疗保险')

insert into Insurances values (newid(),2,'李四',250,'养老保险')

insert into Insurances values (newid(),2,'李四',350,'医疗保险')

insert into Insurances values (newid(),3,'王二',150,'养老保险')

insert into Insurances values (newid(),3,'王二',300,'医疗保险')

 

3.查询表数据

 

select HRMS,Name,InsuranceMoney,InsuranceName From Insurances

 

HRMS                 Name                 InsuranceMoney        InsuranceName

-------------------- -------------------- --------------------- ----------

1                    张三                  200.00                养老保险

2                    李四                  350.00                医疗保险

2                    李四                  250.00                养老保险

1                    张三                  300.00                医疗保险

3                    王二                  300.00                医疗保险

3                    王二                  150.00                养老保险

 

4.转置表数据

 

 

select * from

(

select HRMS,Name,InsuranceMoney,InsuranceName from Insurances

) p

Pivot (

sum(InsuranceMoney)

FOR InsuranceName IN

( [医疗保险], [养老保险]))

as pvt

 

 

HRMS                 Name                 医疗保险                 养老保险

-------------------- -------------------- --------------------- ---------------------

2                    李四                  350.00                250.00

3                    王二                  300.00                150.00

1                    张三                  300.00                200.00

 

5.偶的问题

 

 images/pivot20080719002.gif

 

这个语句中 医疗保险、养老保险 是SQL语句中写死的,而且Sql2005中这个代码没有办法使用动态的查询结果集

 


5.存储过程解决问题

 

所以如果要动态的完成个脚本,可以先拼出SQL 然后通过exec sp_executesql 执行

 

实现存储过程

 

create procedure InsurancePivot

as

Begin

    DECLARE @ColumnNames VARCHAR(3000)

 

    SET @ColumnNames=''

 

    SELECT

       @ColumnNames = @ColumnNames + '[' + InsuranceName + '],'

    FROM

       (

       SELECT DISTINCT InsuranceName FROM Insurances

       ) t

 

    SET @ColumnNames= LEFT(@ColumnNames, LEN(@ColumnNames)-1)

 

    DECLARE @selectSQL NVARCHAR(3000)

 

    SET @selectSQL=

    'SELECT HRMS,Name,{0} FROM

       (

       SELECT HRMS,Name,InsuranceMoney,InsuranceName FROM Insurances

       ) p

     Pivot( Max(InsuranceMoney)  For InsuranceName in ({0})) AS pvt

       ORDER BY HRMS'

 

    SET @selectSQL= REPLACE(@selectSQL,'{0}',@ColumnNames)

 

    exec sp_executesql @selectSQL

end

 

测试存储过程:

 

exec InsurancePivot

 

HRMS                 Name                 养老保险                 医疗保险

-------------------- -------------------- --------------------- ---------------------

1                    张三                  200.00                300.00

2                    李四                  250.00                350.00

3                    王二                  150.00                300.00


if exists(select name from sysobjects
          where name='Proc_InsurancePivot' and type = 'p')
   drop procedure Proc_InsurancePivot
GO
create procedure Proc_InsurancePivot
as
set nocount on
Begin
    DECLARE @ColumnNames VARCHAR(3000)
    SET @ColumnNames=''
    SELECT
       @ColumnNames = @ColumnNames + '[' + elementName + '],'
    FROM
       (
       SELECT DISTINCT elementName FROM CMS_FormType where IsShow='True'
       ) t
    SET @ColumnNames= LEFT(@ColumnNames, LEN(@ColumnNames)-1)
    DECLARE @selectSQL NVARCHAR(3000)
    SET @selectSQL='SELECT * FROM(
        select a.FormValue,a.groupId,a.createon,b.elementName from dbo.CMS_FormValue a
inner join dbo.CMS_FormType b
on a.FormId=b.FormId
where b.IsShow=''True''
) p
     Pivot(Max(FormValue) For elementName in ({0})) AS pvt order by createon desc'
    SET @selectSQL= REPLACE(@selectSQL,'{0}',@ColumnNames)
    exec sp_executesql @selectSQL
end

exec Proc_InsurancePivot

select * from CMS_FormValue

SELECT * FROM(
   select a.FormValue,a.groupId,a.createon,b.elementName from dbo.CMS_FormValue a
inner join dbo.CMS_FormType b
on a.FormId=b.FormId
where b.IsShow='True'
) as p
     Pivot(max(FormValue) For elementName in ([Email],[留言内容],[爱好])) AS pvt order by createon desc


1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READme.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 、 1资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READmE.文件(md如有),本项目仅用作交流学习参考,请切勿用于商业用途。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值