当前位置: 代码迷 >> Sql Server >> 请熟悉SQL的进来帮帮手,该怎么解决
  详细解决方案

请熟悉SQL的进来帮帮手,该怎么解决

热度:29   发布时间:2016-04-27 17:55:59.0
请熟悉SQL的进来帮帮手
有一个查询出来的列表结果是
DateName     Span                     Weeks         WorkStatusName
时间段一     08:00-08:30       长周一         在岗
时间段二     08:30-09:30       长周一         修息
时间段三     09:00-09:30       长周一         在岗
时间段四     09:00-10:30       长周一         在岗
时间段二     08:00-08:30       短周一         在岗
时间段二     08:00-08:30       短周一         修息
时间段三     08:00-08:30       短周一         在岗
..
想排成这样的格式

名称             时间段             长周一   短周一     ...
时间段一   08:00-08:30     在岗       在岗
时间段二   08:30-09:30     修息       在岗
时间段三   09:00-09:30     在岗       在岗
时间段四   09:00-10:30     在岗


..
谢谢



------解决方案--------------------

Declare @S Nvarchar(4000)
Select @S = N 'Select [DateName] As 名称, Span As 时间段 '
Select @S = @S + N ', Max(Case Weeks When N ' ' ' + Weeks + ' ' ' Then WorkStatusName Else ' ' ' ' End) As ' + Weeks
From (Select Distinct Weeks From TableName) A
Select @S = @S + ' From TableName Group By [DateName], Span '
EXEC(@S)
------解决方案--------------------
create table ta ([DateName] varchar(20), Span varchar(20) ,
Weeks varchar(10), WorkStatusName varchar(10))
insert ta
select '时间段一 ', '08:00-08:30 ', '长周一 ', '在岗 'union all
select '时间段二 ', '08:30-09:30 ', '长周一 ', '修息 'union all
select '时间段三 ', '09:00-09:30 ', '长周一 ', '在岗 'union all
select '时间段四 ', '09:00-10:30 ', '长周一 ', '在岗 'union all
select '时间段二 ', '08:00-08:30 ', '短周一 ', '在岗 'union all
select '时间段二 ', '08:00-08:30 ', '短周一 ', '修息 'union all
select '时间段三 ', '08:00-08:30 ', '短周一 ', '在岗 '

declare @sql varchar(2000)
select @sql=isnull(@sql, ' ')+ ',[ '+weeks+ ']=max( case weeks when ' ' '+weeks+ ' ' ' then WorkStatusName else ' ' ' ' end) '
from ta group by Weeks
--print @sql
select @sql= 'select [DateName],Span '[email protected]+ ' from ta group by [DateName],Span '
exec(@sql)


DateName Span 长周一 短周一
-------------------- -------------------- ---------- ----------
时间段二 08:00-08:30 在岗
时间段三 08:00-08:30 在岗
时间段一 08:00-08:30 在岗
时间段二 08:30-09:30 修息
时间段三 09:00-09:30 在岗
时间段四 09:00-10:30 在岗

(6 行受影响)



------解决方案--------------------
select s.Datename,max(s.span) as '时间段 ',t.WorkStatusName as '长同一 ',v.WorkStatusName as '短周一 '
  相关解决方案