sql server 2005中,如何将行列转换?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql server 2005中,如何将行列转换?相关的知识,希望对你有一定的参考价值。

表1:
星期 日期 一班 二班
星期二 2012-5-1 0:00 张,王 李,赵
星期三 2012-5-2 0:00 李,赵 张,王
星期四 2012-5-3 0:00 张,王 李,赵
星期五 2012-5-4 0:00 李,赵 张,王
星期六 2012-5-5 0:00 张,王 李,赵
星期日 2012-5-6 0:00 李,赵 张,王
星期一 2012-5-7 0:00 张,王 李,赵
星期二 2012-5-8 0:00 李,赵 张,王
星期三 2012-5-9 0:00 ddd 李,赵
表2:
星期 星期一 星期二 星期三 星期四 星期五 星期六 星期日
日期 2012.5.1 2012.5.2 2012.5.3 2012.5.4 2012.5.5 2012.5.6
一班 "
张,王" 李,赵 张,王 李,赵 张,王 李,赵
二班 李,赵 张,王 李,赵 张,王 李,赵 张,王
日期 2012.5.7 2012.5.8 2012.5.9 2012.5.10 2012.5.11 2012.5.12 2012.5.13
一班 张,王 李,赵
二班 李,赵 张,王
sql server 2005中,如何把表1的数据格式转换为表2的格式?

create table test1(星期 varchar(10),日期 datetime,一班 varchar(10),二班 varchar(10))

insert into test1
select '星期二', '2012-5-1 0:00','张,王',' 李,赵 '
union all
select ' 星期三','2012-5-2 0:00','李,赵','张,王 '
union all

select ' 星期四 ','2012-5-3 0:00','张,王','李,赵' union all
select '星期五','2012-5-4 0:00','李,赵','张,王' union all
select '星期六','2012-5-5 0:00','张,王','李,赵' union all
select '星期日','2012-5-6 0:00','李,赵','张,王' union all
select '星期一','2012-5-7 0:00','张,王','李,赵' union all
select '星期二','2012-5-8 0:00','李,赵','张,王' union all
select '星期三','2012-5-9 0:00','ddd','李,赵'

因为sqlserver pivot 函数转换的时候 都是转换一列,你这个要转3个列,因为也要把日期给转上去。 所以 就先 把你的源表分开。分成 临时表1( 日期,星期,一班)、临时表2(日期,星期,二班)。等两个都转换好了之后 再union 。 下班是我转的 第一。只把一班的转过来了。二班的 类似就行了,到时候一班二班union的时候 按照日期排序,所以都先保留了日期。。 比较复杂,暂时没有想到好的办法。。。。。。

select *,ROW_NUMBER() over(order by 日期 asc) row,case when 星期一 is not null then 日期 end 星期一1,
case when 星期二 is not null then 日期 end 星期二1,
case when 星期三 is not null then 日期 end 星期三1,
case when 星期四 is not null then 日期 end 星期四1,
case when 星期五 is not null then 日期 end 星期五1,
case when 星期六 is not null then 日期 end 星期六1,
case when 星期日 is not null then 日期 end 星期日1
into #a
from (
select * from (
select 星期,日期,一班 from test1
) a
pivot (
max(一班)
for 星期 in (星期一,星期二,星期三,星期四,星期五,星期六,星期日)
)pvt

) a

select * from (
select row,日期,星期一,星期二,星期三,星期四,星期五,星期六,星期日 from #a
union all
select ROW,日期,convert(varchar(10),星期一1,120 ),convert(varchar(10),星期二1,120 ),convert(varchar(10),星期三1,120 ),convert(varchar(10),星期四1,120 ),convert(varchar(10),星期五1,120 ),convert(varchar(10),星期六1,120 ),convert(varchar(10),星期日1,120 ) from #a
)a order by 1追问

运行出来的结果有很多空的。我需要将表1数据转为表2的形式

追答

=======================================================
===================================================

应该就是这样的一个模型。 把结果集转置成多行的。 只是显示的顺序还需要调整一下。你再琢磨琢磨吧,下班了。五一了啊。。。

select * into #c from (
select 星期,ltrim(一班) 一班 from test1
union all
select 星期,convert(varchar(10),日期,120) 日期 from test1
union all
select 星期,ltrim(二班) from test1
) a

select MAX(case when 星期='星期一' then 一班 end) as 星期一 ,
MAX(case when 星期='星期二' then 一班 end) as 星期二 ,
MAX(case when 星期='星期三' then 一班 end) as 星期三 ,
MAX(case when 星期='星期四' then 一班 end) as 星期四 ,
MAX(case when 星期='星期五' then 一班 end) as 星期五 ,
MAX(case when 星期='星期六' then 一班 end) as 星期六 ,
MAX(case when 星期='星期日' then 一班 end) as 星期日
from (

select *,ROW_NUMBER() over(partition by 星期 order by 一班) rn from #c
) a
group by rn

参考技术A 行转列,有很多通用的方法,搜索这个关键字就行了。

???Sql Server???SQL SERVER ????????????

?????????mamicode   col   ??????   info   ??????   ??????   set   dbcc   ??????   

??????:???Sql Server???SQL SERVER ????????????

??????????????????????????????????????????????????????????????????????????????????????????(recovery)??????????????????

??????????????????????????????????????????????????????????????????????????????????????????????????????????????????

??????????????????????????????????????????????????????????????????

#??????????????????????????????????????????

1??????????????????????????????

????????????

2?????????????????????????????????“??????”??????“??????”

????????????

3???????????????????????????“??????”->“??????”

????????????

 ????????????

4???????????????????????????????????????????????????“??????”

????????????

#????????????????????????

 

ALTER DATABASE test SET RECOVERY SIMPLE --???“????????????”?????????“??????”
GO
USE test
GO
DBCC SHRINKFILE (N???test_log??? , 1, TRUNCATEONLY)--???????????????????????????1M
GO
USE test
GO
ALTER DATABASE test SET RECOVERY FULL WITH NO_WAIT ----???“????????????”?????????“??????”
GO
ALTER DATABASE test SET RECOVERY FULL
GO

 

 

 

 

?????????????????????????????????“??????”?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????

 

以上是关于sql server 2005中,如何将行列转换?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MS Access 2007 或 MS SQL Server 2005 中通过 SQL 将字段转换为行

如何转换SQL Server 2008数据库到SQL Server 2005

临时表中行列直接的装换

SQL Server中行列转换 Pivot UnPivot

SQL Server中行列转换 Pivot UnPivot

将 XML 转换为表 SQL Server 2005