帮助交叉联接创建周视图日历

时间:2011-09-15 19:57:13

标签: sql sql-server tsql calendar

大家好我有一张叫做预订的桌子(Ive用粗线对齐)

CustID  VenueID BookingDt                   Session

45      44      2010-03-20 00:00:00.000     PM      
45      44      2010-03-27 00:00:00.000     PM      
45      44      2009-10-18 00:00:00.000     PM          
45      44      2009-10-24 00:00:00.000     PM

我有另一张名为Venues的桌子

oID oLocation   oPitch

1   Left Park   Rugby
2   Right Park  Rugby

表格由Venues.oID = bookings .CustID

加入

我想制作一个像这样的表

X列=工作日 Y列=位置

oID  oSun oMon oTue oWed oThu oFri oSat

1    x          x    x         x
2    x    x          x    x    x   x x

我相信我必须与预订数据库

中的数据进行交叉连接

例如

select distinct v.olocation , b.BookingDt from oVenue V 
cross join tblBookings B
Where B.VenueID=V.oID
and  DATEPART( wk, b.BookingDt )='44' 
and  DATEPART( yy, b.BookingDt )='2009' 

但这确实是oID和Date,我希望它检查一下是否存在该日期,如果是这样的话,将x放在其他位置,将其置于其位置。

不确定最佳方式。 非常感谢任何帮助。

提前致谢

2 个答案:

答案 0 :(得分:2)

由于您已经在查询中限制了周和年,因此这是显示它的方式:

select
  v.olocation,
  max(case DATEPART(weekday, b.BookingDt) When 1 then 'x' else '' end) Sun,
  max(case DATEPART(weekday, b.BookingDt) When 2 then 'x' else '' end) Mon,
  max(case DATEPART(weekday, b.BookingDt) When 3 then 'x' else '' end) Tue,
  max(case DATEPART(weekday, b.BookingDt) When 4 then 'x' else '' end) Wed,
  max(case DATEPART(weekday, b.BookingDt) When 5 then 'x' else '' end) Thu,
  max(case DATEPART(weekday, b.BookingDt) When 6 then 'x' else '' end) Fri,
  max(case DATEPART(weekday, b.BookingDt) When 7 then 'x' else '' end) Sat
from
(
    select distinct v.olocation , b.BookingDt 
    from oVenue V 
    LEFT JOIN tblBookings B on B.VenueID=V.oID
    and  DATEPART( wk, b.BookingDt )='44' 
    and  DATEPART( yy, b.BookingDt )='2009' 
) selweek
group by v.olocation

答案 1 :(得分:1)

数据的显示方式应该是前端问题,而不是数据库问题。我不会专注于将“x”放在特定位置的事情。返回您的应用程序需要填写日历的数据,并让前端执行该操作。

那就是说,为了创建你想要的结果,你错过了一组数据 - 日历天数。您可以使用数据库中的临时表,CTE或永久表来执行此操作,但您基本上需要一个表格,该表格可以为您提供所有相关日期作为结果集。然后,您可以LEFT OUTER JOIN从该表格到您的预订表格,并使用CASE根据是否找到匹配的预订行来填写值。