SQLSERVER 如何将一列数据转多列?

会飞的鱼1216 平民老百姓  2017-11-24 11:36:39
现在表中的数据
id name week_1 week_2 week_3 week_4 week_5 week_6 week_7
1 制度一 规则一 规则一 规则一 规则一 规则一 规则二 规则三
2 制度二 规则一 规则一 规则一 规则一 规则一 规则一 规则二

上面的字段week_1代表的是星期一,后面以此类推。

如何将查询结果显示为
id name type week
1 制度一 规则一 星期一
1 制度一 规则一 星期二
1 制度一 规则一 星期三
1 制度一 规则一 星期四
1 制度一 规则一 星期五
1 制度一 规则二 星期六
1 制度一 规则三 星期日

2 制度二 规则一 星期一
2 制度二 规则一 星期二
2 制度二 规则一 星期三
2 制度二 规则一 星期四
2 制度二 规则一 星期五
2 制度二 规则一 星期六
2 制度二 规则二 星期日

...全文
318 7 点赞 打赏 收藏 举报
写回复
7 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
会飞的鱼1216 2017-11-27
数据结构不是我定义的,改不了。
  • 打赏
  • 举报
回复
snlixing 2017-11-25
楼主可以考虑一下按你的查询结果重构你的数据结构
  • 打赏
  • 举报
回复
会飞的鱼1216 2017-11-24
我要将查询保存一个试图,保存完试图后,我还要通过该试图去关联呢
  • 打赏
  • 举报
回复
会飞的鱼1216 2017-11-24
我要将结果保存一个试图怎么办呢?
  • 打赏
  • 举报
回复
declare @t
	table(id int
	,name nvarchar(10)
	,week_1 nvarchar(10),week_2 nvarchar(10),week_3 nvarchar(10),week_4 nvarchar(10),week_5 nvarchar(10),week_6 nvarchar(10),week_7 nvarchar(10)
)
insert @t select 1,'制度一','规则一','规则一','规则一','规则一','规则一','规则二','规则三'
insert @t select 2,'制度二','规则一','规则一','规则一','规则一','规则一','规则一','规则二'


select id,name,[type]
	,[week]=datename(weekday,dateadd(d,right([week],1)-1,'1900-01-01'))
from @t
unpivot([type] for [week] in([week_1],[week_2],[week_3],[week_4],[week_5],[week_6],[week_7]))t

/*
id	name	type	week
1	制度一	规则一	星期一
1	制度一	规则一	星期二
1	制度一	规则一	星期三
1	制度一	规则一	星期四
1	制度一	规则一	星期五
1	制度一	规则二	星期六
1	制度一	规则三	星期日
2	制度二	规则一	星期一
2	制度二	规则一	星期二
2	制度二	规则一	星期三
2	制度二	规则一	星期四
2	制度二	规则一	星期五
2	制度二	规则一	星期六
2	制度二	规则二	星期日
*/
  • 打赏
  • 举报
回复
yilanwuyu123 2017-11-24
脚本楼上都写了,纯Mark.
  • 打赏
  • 举报
回复
if object_id('tmp_t')is not null drop table tmp_t
create table  tmp_t
    (id int
    ,name nvarchar(10)
    ,week_1 nvarchar(10),week_2 nvarchar(10),week_3 nvarchar(10),week_4 nvarchar(10),week_5 nvarchar(10),week_6 nvarchar(10),week_7 nvarchar(10)
)
insert tmp_t select 1,'制度一','规则一','规则一','规则一','规则一','规则一','规则二','规则三'
insert tmp_t select 2,'制度二','规则一','规则一','规则一','规则一','规则一','规则一','规则二'
go
if object_id('v_t')is not null drop view v_t
go
create view v_t as
select id,name,[type]
    ,[week]=datename(weekday,dateadd(d,right([week],1)-1,'1900-01-01'))
from tmp_t
unpivot([type] for [week] in([week_1],[week_2],[week_3],[week_4],[week_5],[week_6],[week_7]))t
go
select * from v_t

/*
id    name    type    week
1    制度一    规则一    星期一
1    制度一    规则一    星期二
1    制度一    规则一    星期三
1    制度一    规则一    星期四
1    制度一    规则一    星期五
1    制度一    规则二    星期六
1    制度一    规则三    星期日
2    制度二    规则一    星期一
2    制度二    规则一    星期二
2    制度二    规则一    星期三
2    制度二    规则一    星期四
2    制度二    规则一    星期五
2    制度二    规则一    星期六
2    制度二    规则二    星期日
*/

  • 打赏
  • 举报
回复
相关推荐
发帖
疑难问题
加入

2.1w+

社区成员

MS-SQL Server 疑难问题
申请成为版主
帖子事件
创建了帖子
2017-11-24 11:36
社区公告
暂无公告