适用于GYM培训师TimeTable和会话预订的T-SQL解决方案

时间:2012-10-10 10:18:44

标签: sql sql-server tsql pivot

我有四张桌子 的 tblEmployees

EmployeeID  Name    
1   Zahiz
2   Nigon
3   Jimian
4   Ash
5   Dani

tblMembers

MemberNo    FirstName
1   Saleem
2   Jamil
3   Jazi
4   funa
5   Jhon
6   Moum
RefSessions

SessionID   StartTime   EndTime
1   0701    0730
2   0731    0800
3   0801    0830
4   0831    0900
5   0901    0930
6   0931    1000
7   1001    1030
8   1031    1100
9   1101    1130
10  1131    1200
11  1201    1230
12  1231    1300
13  1301    1330
14  1331    1400
15  1401    1430
16  1431    1500
17  1501    1530
18  1531    1600
19  1601    1630
20  1631    1700
21  1701    1730
22  1731    1800
23  1801    1830
24  1831    1900
25  1901    1930
26  1931    2000
27  2001    2030
28  2031    2100

tblBookSession

BookingID   SessionID   EmployeeID  MemberNo    SessionDate
1   15  2   3   2012-09-30 
2   16  2   3   2012-09-30 
3   1   3   4   2012-10-03
4   2   3   4   2012-10-03
5   3   3   4   2012-10-03
6   4   3   4   2012-10-03

I am looking for a t-sql query resulting in said form against a specific date

它实际上预订了健身房训练员的时间段并以明日报告的形式显示

1 个答案:

答案 0 :(得分:3)

您需要执行PIVOT。有两种方法可以使用PIVOT执行此操作,可以使用静态数据透视表来编码要转换的列,也可以使用动态数据透视表来确定执行时的列。

静态数据透视表,您需要对值进行硬编码:

select name,
   IsNull([701-730], '') [701-730],
   IsNull([731-800], '') [731-800],
   IsNull([801-830], '') [801-830],
   IsNull([831-900], '') [831-900]
from
(
  select e.name,
    cast(e.starttime as varchar(10))+'-'
      +cast(e.endtime as varchar(10)) Session,
    m.FirstName
  from
  (
    select *
    from tblEmployees e
    cross apply RefSessions
  ) e
  left join tblBookSession b
    on e.EmployeeID = b.EmployeeID
    and e.sessionid = b.sessionid
  left join tblMembers m
    on b.MemberNo = m.MemberNo
) x
pivot
(
  max(FirstName)
  for session in ([701-730], [731-800], [801-830], [831-900]) -- additional sessions here
)p

请参阅SQL Fiddle with Demo

如果您有许多值要转换为列或未知数量的值,那么您将需要使用PIVOT的动态sql版本:

DECLARE @cols AS NVARCHAR(MAX),
    @colsPivot AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT ',' 
                      + QUOTENAME(cast(starttime as varchar(10))
                                  +'-'+cast(endtime as varchar(10))) 
                    from RefSessions
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')



select @colsPivot = STUFF((SELECT ', IsNull(' 
                      + QUOTENAME(cast(starttime as varchar(10))
                          +'-'+cast(endtime as varchar(10))) +', '''') as [' +
                           cast(starttime as varchar(10))
                                  +'-'+cast(endtime as varchar(10)) + ']'
                    from RefSessions
                    group by SessionID, starttime, endtime
                    order by SessionID 
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')



set @query = 'SELECT name, ' + @colsPivot + ' from 
             (
                  select e.name,
                    cast(starttime as varchar(10))+''-''
                      +cast(endtime as varchar(10)) Session,
                    m.FirstName
                  from
                  (
                    select *
                    from tblEmployees e
                    cross apply RefSessions
                  ) e
                  left join tblBookSession b
                    on e.EmployeeID = b.EmployeeID
                    and e.sessionid = b.sessionid
                  left join tblMembers m
                    on b.MemberNo = m.MemberNo
            ) x
            pivot 
            (
                max(FirstName)
                for Session in (' + @cols + ')
            ) p '

execute(@query)

请参阅SQL Fiddle with Demo