行转列(Sql练习)

行转列的问题,我有一个表如下:TI
我想把他变成下边的格式怎么做
A,B,C,O
1,1,S,D
1,2,T,E
1,2,F,R
1,1,G,D
1,1,H,D
1,3,J,D
2,2,S,D
2,2,T,E
……………….
变成   T2
T2中的S,T,F,G,H,J列是T1表C列的内容
A,S,T,F,G,H,J,O
1,1,2,3,1,1,3,D/E/R
2,2,2,0,0,0,0,D/E
帮帮忙啊各位老大! 

题目分析:1 C列进行第一次行转列。2  O列进行第2次的类似行转列。

行转列的基本形式:1 定义字符串变量 2 通过Select对要行转列的列进行进行字符串初始化

特殊说明: 1 如果行转列后还需对新列进行类似O列的处理时,尽可能的将处理放入函数中(看的清楚)

                      2 如果行转列要是有重复的列,那么需要在行转列的表中将重复的行处理掉。

                      3 行转列的条件在这里是分组条件Group By A(是不是行转列的主键都需要对原来表某个字段进行分组呢?)

本题答案:

  create table tb(A int,B int,C char(1),O varchar(2))
insert tb select 1,1,'S','D'
insert tb select 1,2,'T','E'
insert tb select 1,2,'F','R'
insert tb select 1,1,'G','D'
insert tb select 1,1,'H','D'
insert tb select 1,3,'J','D'
insert tb select 2,2,'S','D'
insert tb select 2,2,'T','E'
go
create   function f_str(@department  int)
returns   varchar(8000)
as
begin
       
declare   @ret   varchar(8000)
       
set   @ret   =   ''
       
select   @ret   =   @ret+case when charindex(O+'/',@ret) > 0 then '' else '/'+ rtrim(O) end    from   tb   where   A   =   @department
       
set   @ret   =   stuff(@ret,1,1,'')
       
return   @ret  
end
go

go

declare @s varchar(8000)
set @s = 'select A'
select @s = @s + ',['+C+']= max(case when C = '''+C+''' then B else 0 end)'
from (select distinct C from tb) a

exec(@s + ',dbo.f_str(a) as O from tb group by a')

--drop table tb
--drop function f_str

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值