一个较为复杂的存储过程

fire_2011 2013-04-27 09:55:44
我这里用的是MFC和Sql server,现在有个上班排班数据库表,表中有列名如下(姓名,账号,票厅号,开始时间,结束时间,班次)如下
name sell_ID kioskID classes time_from time_to
柳 1001 一号票厅 上午 2013/4/5 2013/4/15
军 1002 二号票厅 下午 2013/4/5 2013/4/15
贞 1003 一号票厅 下午 2013/4/3 2013/4/13
霞 1004 六号票厅 上午 2013/4/12 2013/4/20


现在想在数据库中用视图或者存储过程,把他存成如下格式
时间 班次 一号票厅 二号票厅 三号票厅 四号票厅 五号票厅 六号票厅
2013/4/5 上午 柳 凤 茜 伲 霞
下午 贞 军 香 华
2013/4/6 上午 柳 凤 茜 伲 霞
下午 贞 军 香 华
应该怎么做好呢,最好给出具体方法,在线求助
...全文
173 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Mr_Nice 2013-04-27
  • 打赏
  • 举报
回复
引用 4 楼 QQ258058051 的回复:
[quote=引用 3 楼 OrchidCat 的回复:]
if object_id('[TB]') is not null drop table [TB]
go
[code=sql] ;WITH tt AS( SELECT classes,time_from,time_to, MAX(CASE WHEN kioskid='一号票厅' THEN NAME ELSE '' END ) AS '一号票厅', MAX(CASE WHEN kioskid='二号票厅' THEN NAME ELSE '' END ) AS '二号票厅', MAX(CASE WHEN kioskid='三号票厅' THEN NAME ELSE '' END ) AS '三号票厅', MAX(CASE WHEN kioskid='四号票厅' THEN NAME ELSE '' END ) AS '四号票厅', MAX(CASE WHEN kioskid='五号票厅' THEN NAME ELSE '' END ) AS '五号票厅', MAX(CASE WHEN kioskid='六号票厅' THEN NAME ELSE '' END ) AS '六号票厅' FROM dbo.TB GROUP BY classes,time_from,time_to) SELECT DATEADD(dd, m.number, tt.time_from) AS 日期 , tt.classes , MAX(tt.一号票厅) AS 一号票厅, --这块做一下调整即可 MAX(tt.二号票厅) AS 二号票厅, MAX(tt.三号票厅) AS 三号票厅, MAX(tt.四号票厅) AS 四号票厅, MAX(tt.五号票厅) AS 五号票厅, MAX(tt.六号票厅) AS 六号票厅 FROM tt LEFT JOIN master..spt_values M ON DATEADD(dd, m.number, tt.time_from) BETWEEN tt.time_from AND tt.time_to AND M.TYPE = 'P' GROUP BY DATEADD(dd, m.number, tt.time_from) , tt.classes ORDER BY DATEADD(dd, m.number, tt.time_from) , tt.classes ASC /* 日期 classes 一号票厅 二号票厅 三号票厅 四号票厅 五号票厅 六号票厅 2013-04-03 00:00:00.000 下午 贞 2013-04-04 00:00:00.000 下午 贞 2013-04-05 00:00:00.000 上午 柳 2013-04-05 00:00:00.000 下午 贞 军 2013-04-06 00:00:00.000 上午 柳 2013-04-06 00:00:00.000 下午 贞 军 2013-04-07 00:00:00.000 上午 柳 2013-04-07 00:00:00.000 下午 贞 军 2013-04-08 00:00:00.000 上午 柳 2013-04-08 00:00:00.000 下午 贞 军 2013-04-09 00:00:00.000 上午 柳 2013-04-09 00:00:00.000 下午 贞 军 2013-04-10 00:00:00.000 上午 柳 2013-04-10 00:00:00.000 下午 贞 军 2013-04-11 00:00:00.000 上午 柳 2013-04-11 00:00:00.000 下午 贞 军 2013-04-12 00:00:00.000 上午 柳 霞 2013-04-12 00:00:00.000 下午 贞 军 2013-04-13 00:00:00.000 上午 柳 霞 2013-04-13 00:00:00.000 下午 贞 军 2013-04-14 00:00:00.000 上午 柳 霞 2013-04-14 00:00:00.000 下午 军 2013-04-15 00:00:00.000 上午 柳 霞 2013-04-15 00:00:00.000 下午 军 2013-04-16 00:00:00.000 上午 霞 2013-04-17 00:00:00.000 上午 霞 2013-04-18 00:00:00.000 上午 霞 2013-04-19 00:00:00.000 上午 霞 2013-04-20 00:00:00.000 上午 霞*/
fire_2011 2013-04-27
  • 打赏
  • 举报
回复
引用 3 楼 OrchidCat 的回复:
if object_id('[TB]') is not null drop table [TB]
go
create table [TB] (name nvarchar(2),sell_ID int,kioskID nvarchar(8),classes nvarchar(4),time_from datetime,time_to datetime)
insert into [TB]
select '柳',1001,'一号票厅','上午','2013/4/5','2013/4/15' union all
select '军',1002,'二号票厅','下午','2013/4/5','2013/4/15' union all
select '贞',1003,'一号票厅','下午','2013/4/3','2013/4/13' union all
select '霞',1004,'六号票厅','上午','2013/4/12','2013/4/20'

select * from [TB]

;WITH tt
AS(
SELECT classes,time_from,time_to,
MAX(CASE WHEN kioskid='一号票厅' THEN NAME ELSE '' END ) AS '一号票厅',
MAX(CASE WHEN kioskid='二号票厅' THEN NAME ELSE '' END ) AS '二号票厅',
MAX(CASE WHEN kioskid='三号票厅' THEN NAME ELSE '' END ) AS '三号票厅',
MAX(CASE WHEN kioskid='四号票厅' THEN NAME ELSE '' END ) AS '四号票厅',
MAX(CASE WHEN kioskid='五号票厅' THEN NAME ELSE '' END ) AS '五号票厅',
MAX(CASE WHEN kioskid='六号票厅' THEN NAME ELSE '' END ) AS '六号票厅'
FROM dbo.TB
GROUP BY classes,time_from,time_to)


SELECT  DATEADD(dd, m.number, tt.time_from) AS 日期 ,
        tt.classes ,
        tt.一号票厅 ,
        tt.二号票厅 ,
        tt.三号票厅 ,
        tt.四号票厅 ,
        tt.五号票厅 ,
        tt.六号票厅
FROM    tt
        LEFT JOIN master..spt_values M ON DATEADD(dd, m.number, tt.time_from) BETWEEN tt.time_from
                                                              AND
                                                              tt.time_to
                                          AND M.TYPE = 'P'
ORDER BY DATEADD(dd, m.number, tt.time_from) ,
        tt.classes ASC

/*
日期	classes	一号票厅	二号票厅	三号票厅	四号票厅	五号票厅	六号票厅
2013-04-03 00:00:00.000	下午	贞					
2013-04-04 00:00:00.000	下午	贞					
2013-04-05 00:00:00.000	上午	柳					
2013-04-05 00:00:00.000	下午	贞					
2013-04-05 00:00:00.000	下午		军				
2013-04-06 00:00:00.000	上午	柳					
2013-04-06 00:00:00.000	下午		军				
2013-04-06 00:00:00.000	下午	贞					
2013-04-07 00:00:00.000	上午	柳					
2013-04-07 00:00:00.000	下午	贞					
2013-04-07 00:00:00.000	下午		军				
2013-04-08 00:00:00.000	上午	柳					
2013-04-08 00:00:00.000	下午		军				
2013-04-08 00:00:00.000	下午	贞					
2013-04-09 00:00:00.000	上午	柳					
2013-04-09 00:00:00.000	下午	贞					
2013-04-09 00:00:00.000	下午		军				
2013-04-10 00:00:00.000	上午	柳					
2013-04-10 00:00:00.000	下午		军				
2013-04-10 00:00:00.000	下午	贞					
2013-04-11 00:00:00.000	上午	柳					
2013-04-11 00:00:00.000	下午	贞					
2013-04-11 00:00:00.000	下午		军				
2013-04-12 00:00:00.000	上午	柳					
2013-04-12 00:00:00.000	上午						霞
2013-04-12 00:00:00.000	下午		军				
2013-04-12 00:00:00.000	下午	贞					
2013-04-13 00:00:00.000	上午						霞
2013-04-13 00:00:00.000	上午	柳					
2013-04-13 00:00:00.000	下午	贞					
2013-04-13 00:00:00.000	下午		军				
2013-04-14 00:00:00.000	上午	柳					
2013-04-14 00:00:00.000	上午						霞
2013-04-14 00:00:00.000	下午		军				
2013-04-15 00:00:00.000	上午						霞
2013-04-15 00:00:00.000	上午	柳					
2013-04-15 00:00:00.000	下午		军				
2013-04-16 00:00:00.000	上午						霞
2013-04-17 00:00:00.000	上午						霞
2013-04-18 00:00:00.000	上午						霞
2013-04-19 00:00:00.000	上午						霞
2013-04-20 00:00:00.000	上午						霞*/
你那个下面 2013-04-08 00:00:00.000 上午 柳 2013-04-08 00:00:00.000 下午 军 2013-04-08 00:00:00.000 下午 贞 大神,这个重复的下午没有合并到一起啊, 2013-04-08 00:00:00.000 上午 柳 2013-04-08 00:00:00.000 下午 贞 军
Mr_Nice 2013-04-27
  • 打赏
  • 举报
回复
if object_id('[TB]') is not null drop table [TB]
go
create table [TB] (name nvarchar(2),sell_ID int,kioskID nvarchar(8),classes nvarchar(4),time_from datetime,time_to datetime)
insert into [TB]
select '柳',1001,'一号票厅','上午','2013/4/5','2013/4/15' union all
select '军',1002,'二号票厅','下午','2013/4/5','2013/4/15' union all
select '贞',1003,'一号票厅','下午','2013/4/3','2013/4/13' union all
select '霞',1004,'六号票厅','上午','2013/4/12','2013/4/20'

select * from [TB]

;WITH tt
AS(
SELECT classes,time_from,time_to,
MAX(CASE WHEN kioskid='一号票厅' THEN NAME ELSE '' END ) AS '一号票厅',
MAX(CASE WHEN kioskid='二号票厅' THEN NAME ELSE '' END ) AS '二号票厅',
MAX(CASE WHEN kioskid='三号票厅' THEN NAME ELSE '' END ) AS '三号票厅',
MAX(CASE WHEN kioskid='四号票厅' THEN NAME ELSE '' END ) AS '四号票厅',
MAX(CASE WHEN kioskid='五号票厅' THEN NAME ELSE '' END ) AS '五号票厅',
MAX(CASE WHEN kioskid='六号票厅' THEN NAME ELSE '' END ) AS '六号票厅'
FROM dbo.TB
GROUP BY classes,time_from,time_to)


SELECT  DATEADD(dd, m.number, tt.time_from) AS 日期 ,
        tt.classes ,
        tt.一号票厅 ,
        tt.二号票厅 ,
        tt.三号票厅 ,
        tt.四号票厅 ,
        tt.五号票厅 ,
        tt.六号票厅
FROM    tt
        LEFT JOIN master..spt_values M ON DATEADD(dd, m.number, tt.time_from) BETWEEN tt.time_from
                                                              AND
                                                              tt.time_to
                                          AND M.TYPE = 'P'
ORDER BY DATEADD(dd, m.number, tt.time_from) ,
        tt.classes ASC

/*
日期	classes	一号票厅	二号票厅	三号票厅	四号票厅	五号票厅	六号票厅
2013-04-03 00:00:00.000	下午	贞					
2013-04-04 00:00:00.000	下午	贞					
2013-04-05 00:00:00.000	上午	柳					
2013-04-05 00:00:00.000	下午	贞					
2013-04-05 00:00:00.000	下午		军				
2013-04-06 00:00:00.000	上午	柳					
2013-04-06 00:00:00.000	下午		军				
2013-04-06 00:00:00.000	下午	贞					
2013-04-07 00:00:00.000	上午	柳					
2013-04-07 00:00:00.000	下午	贞					
2013-04-07 00:00:00.000	下午		军				
2013-04-08 00:00:00.000	上午	柳					
2013-04-08 00:00:00.000	下午		军				
2013-04-08 00:00:00.000	下午	贞					
2013-04-09 00:00:00.000	上午	柳					
2013-04-09 00:00:00.000	下午	贞					
2013-04-09 00:00:00.000	下午		军				
2013-04-10 00:00:00.000	上午	柳					
2013-04-10 00:00:00.000	下午		军				
2013-04-10 00:00:00.000	下午	贞					
2013-04-11 00:00:00.000	上午	柳					
2013-04-11 00:00:00.000	下午	贞					
2013-04-11 00:00:00.000	下午		军				
2013-04-12 00:00:00.000	上午	柳					
2013-04-12 00:00:00.000	上午						霞
2013-04-12 00:00:00.000	下午		军				
2013-04-12 00:00:00.000	下午	贞					
2013-04-13 00:00:00.000	上午						霞
2013-04-13 00:00:00.000	上午	柳					
2013-04-13 00:00:00.000	下午	贞					
2013-04-13 00:00:00.000	下午		军				
2013-04-14 00:00:00.000	上午	柳					
2013-04-14 00:00:00.000	上午						霞
2013-04-14 00:00:00.000	下午		军				
2013-04-15 00:00:00.000	上午						霞
2013-04-15 00:00:00.000	上午	柳					
2013-04-15 00:00:00.000	下午		军				
2013-04-16 00:00:00.000	上午						霞
2013-04-17 00:00:00.000	上午						霞
2013-04-18 00:00:00.000	上午						霞
2013-04-19 00:00:00.000	上午						霞
2013-04-20 00:00:00.000	上午						霞*/
daiyueqiang2045 2013-04-27
  • 打赏
  • 举报
回复
行变列的部分 http://www.cnblogs.com/worfdream/articles/2409162.html
fire_2011 2013-04-27
  • 打赏
  • 举报
回复
现在想在数据库中用视图或者存储过程,把他存成如下格式 时间 班次 一号票厅 二号票厅 三号票厅 四号票厅 五号票厅 六号票厅 2013/4/5 上午 柳 凤 茜 伲 霞 下午 贞 军 香 华 2013/4/6 上午 柳 凤 茜 伲 霞 下午 贞 军 香 华 应该怎么做好呢,最好给出具体方法,在线求助 (上面有点乱重新写一下)
fire_2011 2013-04-27
  • 打赏
  • 举报
回复
引用 5 楼 OrchidCat 的回复:
[quote=引用 4 楼 QQ258058051 的回复:] [quote=引用 3 楼 OrchidCat 的回复:]
if object_id('[TB]') is not null drop table [TB]
go
[code=sql] ;WITH tt AS( SELECT classes,time_from,time_to, MAX(CASE WHEN kioskid='一号票厅' THEN NAME ELSE '' END ) AS '一号票厅', MAX(CASE WHEN kioskid='二号票厅' THEN NAME ELSE '' END ) AS '二号票厅', MAX(CASE WHEN kioskid='三号票厅' THEN NAME ELSE '' END ) AS '三号票厅', MAX(CASE WHEN kioskid='四号票厅' THEN NAME ELSE '' END ) AS '四号票厅', MAX(CASE WHEN kioskid='五号票厅' THEN NAME ELSE '' END ) AS '五号票厅', MAX(CASE WHEN kioskid='六号票厅' THEN NAME ELSE '' END ) AS '六号票厅' FROM dbo.TB GROUP BY classes,time_from,time_to) SELECT DATEADD(dd, m.number, tt.time_from) AS 日期 , tt.classes , MAX(tt.一号票厅) AS 一号票厅, --这块做一下调整即可 MAX(tt.二号票厅) AS 二号票厅, MAX(tt.三号票厅) AS 三号票厅, MAX(tt.四号票厅) AS 四号票厅, MAX(tt.五号票厅) AS 五号票厅, MAX(tt.六号票厅) AS 六号票厅 FROM tt LEFT JOIN master..spt_values M ON DATEADD(dd, m.number, tt.time_from) BETWEEN tt.time_from AND tt.time_to AND M.TYPE = 'P' GROUP BY DATEADD(dd, m.number, tt.time_from) , tt.classes ORDER BY DATEADD(dd, m.number, tt.time_from) , tt.classes ASC /* 日期 classes 一号票厅 二号票厅 三号票厅 四号票厅 五号票厅 六号票厅 2013-04-03 00:00:00.000 下午 贞 2013-04-04 00:00:00.000 下午 贞 2013-04-05 00:00:00.000 上午 柳 2013-04-05 00:00:00.000 下午 贞 军 2013-04-06 00:00:00.000 上午 柳 2013-04-06 00:00:00.000 下午 贞 军 2013-04-07 00:00:00.000 上午 柳 2013-04-07 00:00:00.000 下午 贞 军 2013-04-08 00:00:00.000 上午 柳 2013-04-08 00:00:00.000 下午 贞 军 2013-04-09 00:00:00.000 上午 柳 2013-04-09 00:00:00.000 下午 贞 军 2013-04-10 00:00:00.000 上午 柳 2013-04-10 00:00:00.000 下午 贞 军 2013-04-11 00:00:00.000 上午 柳 2013-04-11 00:00:00.000 下午 贞 军 2013-04-12 00:00:00.000 上午 柳 霞 2013-04-12 00:00:00.000 下午 贞 军 2013-04-13 00:00:00.000 上午 柳 霞 2013-04-13 00:00:00.000 下午 贞 军 2013-04-14 00:00:00.000 上午 柳 霞 2013-04-14 00:00:00.000 下午 军 2013-04-15 00:00:00.000 上午 柳 霞 2013-04-15 00:00:00.000 下午 军 2013-04-16 00:00:00.000 上午 霞 2013-04-17 00:00:00.000 上午 霞 2013-04-18 00:00:00.000 上午 霞 2013-04-19 00:00:00.000 上午 霞 2013-04-20 00:00:00.000 上午 霞*/ [/quote] 这个结果可以作为视图么,我想将这个结果作为视图然后方便后面用到

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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