T-SQL解决方案,用于健身教练时间表和课程预订

T-SQL解决方案,用于健身教练时间表和课程预订,sql,sql-server,tsql,pivot,Sql,Sql Server,Tsql,Pivot,我有四张桌子 t员工 EmployeeID Name 1 Zahiz 2 Nigon 3 Jimian 4 Ash 5 Dani MemberNo FirstName 1 Saleem 2 Jamil 3 Jazi 4 funa 5 Jhon 6 Moum 雇员ID名称 1扎希兹 尼贡2号 3吉面 4灰烬 5丹尼 tblMembers 成员没有名字 1萨利姆 2杰米尔 3贾齐 4福纳 5约翰 6摩尔 RefSessions Employ

我有四张桌子 t员工

EmployeeID Name 1 Zahiz 2 Nigon 3 Jimian 4 Ash 5 Dani MemberNo FirstName 1 Saleem 2 Jamil 3 Jazi 4 funa 5 Jhon 6 Moum 雇员ID名称 1扎希兹 尼贡2号 3吉面 4灰烬 5丹尼 tblMembers 成员没有名字 1萨利姆 2杰米尔 3贾齐 4福纳 5约翰 6摩尔 RefSessions

EmployeeID Name 1 Zahiz 2 Nigon 3 Jimian 4 Ash 5 Dani MemberNo FirstName 1 Saleem 2 Jamil 3 Jazi 4 funa 5 Jhon 6 Moum 会话ID开始时间结束时间 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

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 BookingID SessionID EmployeeID成员无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


它实际上是在健身房预订培训师的时间段,并以日期报告的形式显示,您将需要执行一个任务。有两种方法可以使用PIVOT实现这一点,一种是对要转换的列进行编码的静态PIVOT,另一种是在执行时确定列的动态PIVOT

对于静态轴,您需要硬编码值:

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 看

如果有许多值要转换为列或未知数量的值,则需要使用动态sql版本的
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

请参见

您将需要执行一次测试。有两种方法可以使用PIVOT实现这一点,一种是对要转换的列进行编码的静态PIVOT,另一种是在执行时确定列的动态PIVOT

对于静态轴,您需要硬编码值:

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 看

如果有许多值要转换为列或未知数量的值,则需要使用动态sql版本的
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