2011-09-15 80 views
0

大家好我有一個名爲預訂這樣的表(伊夫粗體顯示的列對齊)幫助與交叉連接創建一個星期查看日曆

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 

我有另一個表稱爲場地

oID oLocation oPitch 

1 Left Park Rugby 
2 Right Park Rugby 

這些表格通過Venues.oID =訂單相互連接.CustID

我想製作這樣的表格

X列=工作日 Ÿ列=位置

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和日期,我希望它做檢查,看看是否有這個日期,如果是的話,把斧子放在其他地方放置一個'''在其位置。

不確定最好的處理方式。 任何幫助,非常感激。

在此先感謝

回答

1

如何顯示的數據應該是一個前端的問題,不是一個數據庫的問題。我不會把注意力集中在諸如在特定位置放置「x」之類的東西。返回您的應用程序需要填寫日曆的數據,然後讓前端執行此操作。

也就是說,爲了創建你想要的結果,你缺少一組數據 - 一組日曆。您可以使用數據庫中的臨時表,CTE或永久表執行此操作,但基本上需要一張表格,可以將所有日期作爲結果集提供給您。然後,您可以從該表中的LEFT OUTER JOIN到您的預訂表,並使用CASE根據是否找到匹配的預訂行來填充值。

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 
+0

我還是不太清楚爲什麼你需要一個CROSS JOIN這一點。您需要一個LEFT JOIN才能將預訂分配到相應的場所ID。 – Chris

+0

我也沒有,我只得到OP的結果,並在這方面努力。重用,寶貝! –

+0

:)我認爲你的建議會做他想要的,如果你使CROSS JOIN指定的ID加左連接。 – Chris