史上最难,列变行转换^_^

insert2003 2005-12-23 03:29:21
标题有些夸张,但应该有一定难度!

有表tb_Test
c_No c_Office c_Time
13509998888 翠星营业 2005-01
13509998888 翠星营业 2005-01
13509998888 翠星营业 2005-02
13509998888 翠星营业 2005-03
13509998888 东南营业 2005-03
13509998888 东南营业 2005-03
13509998888 东南营业 2005-04
13509998888 东南营业 2005-04
13509998888 东南营业 2005-04
13509998888 东南营业 2005-04
13509998888 东南营业 2005-04
......

这个c_Time会一直从01月份到12月份

要得到如下结果
c_No c_Time_Office1 c_Time_Office2 c_Time_Office3 c_Time_Office4
13509998888 翠星营业 翠星营业 翠星营业 东南营业
13509998888 翠星营业 东南营业 东南营业
13509998888 东南营业 东南营业
13509998888 东南营业 东南营业
13509998888 东南营业

就是按c_Time的月份,以每个月份为一列,将每个月份时的c_Office做为一列。
可能描述得不太清楚,只要得到这个结果就行!

大家有没有什么好的方法?
...全文
258 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
jxzhaogang 2005-12-26
  • 打赏
  • 举报
回复
有一定的難度,建議用以個sp解決.
hpym365 2005-12-23
  • 打赏
  • 举报
回复
看看这样的行不?
select c_NO,
c_time_office1 = sum(case c_time when '2005-01' then 1 else '' end ),
c_time_office2 = sum(case c_time when '2005-02' then 1 else '' end ),
c_time_office3 = sum(case c_time when '2005-03' then 1 else '' end ),
c_time_office4 = sum(case c_time when '2005-04' then 1 else '' end )
from tb_test
group by c_no
常飞梦 2005-12-23
  • 打赏
  • 举报
回复
学习!
zhaoanle 2005-12-23
  • 打赏
  • 举报
回复
好方法
zkc727 2005-12-23
  • 打赏
  • 举报
回复
declare @F varchar(8000),@T varchar(8000),@MT varchar(8000),@S varchar(8000)
set @MT=' from tb_test '
set @F='select tb_test.c_No'
select @F=@F+',['+c_Time+'].c_Office as '''+c_Time+'''' from (select c_Time from tb_test group by c_Time) a
set @T=''
select @T=@T+'left join tb_test ['+c_Time+'] on tb_test.c_No=['+c_Time+'].c_No and ['+
c_Time+'].c_Time='''+c_Time+'''' from (select c_Time from tb_test group by c_Time) a
print @F
print @T
set @S=@F+@MT+@T
exec(@S)
mislrb 2005-12-23
  • 打赏
  • 举报
回复
学习
子陌红尘 2005-12-23
  • 打赏
  • 举报
回复
--生成测试数据
create table tb_Test(c_No varchar(20),c_Office varchar(10),c_Time varchar(10))
insert into tb_Test select '13509998888','翠星营业','2005-01'
insert into tb_Test select '13509998888','翠星营业','2005-01'
insert into tb_Test select '13509998888','翠星营业','2005-02'
insert into tb_Test select '13509998888','翠星营业','2005-03'
insert into tb_Test select '13509998888','东南营业','2005-03'
insert into tb_Test select '13509998888','东南营业','2005-03'
insert into tb_Test select '13509998888','东南营业','2005-04'
insert into tb_Test select '13509998888','东南营业','2005-04'
insert into tb_Test select '13509998888','东南营业','2005-04'
insert into tb_Test select '13509998888','东南营业','2005-04'
insert into tb_Test select '13509998888','东南营业','2005-04'

--执行处理过程
select identity(int,1,1) as rowid,0 as rid,* into #T from tb_Test
update a set rid=(select count(*) from #t where c_No=a.c_No and c_Time=a.c_Time and rowid<=a.rowid) from #t a

declare @s varchar(8000)
set @s = ''

select @s = @s+',c_Time_Office'+a.mon+'=max(case right(c_Time,2) when '''+a.mon+''' then c_Office end)'
from (select distinct mon=right(c_Time,2) from #T) a order by a.mon

set @s = 'select c_No'+@s+' from #T group by c_No,rid order by rid'

exec(@s)


--删除测试数据
drop table tb_Test,#T

--输出结果
/*
c_No c_Time_Office1 c_Time_Office2 c_Time_Office3 c_Time_Office4
13509998888 翠星营业 翠星营业 翠星营业 东南营业
13509998888 翠星营业 NULL 东南营业 东南营业
13509998888 NULL NULL 东南营业 东南营业
13509998888 NULL NULL NULL 东南营业
13509998888 NULL NULL NULL 东南营业
*/

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧