2013-06-12 66 views
2

在項目中,用戶可以預定活動的房間。在一個事件中,我們可以有許多保留(tblEventTimePeriod)與許多房間(tblEventTimePeriodRoom) 我有這樣的數據庫結構。我去掉不必要的列,以簡化的例子中,表之間快速查詢最終用戶報告

tblEvent (ID, Name) 
tblEventTimePeriod (ID, EventId) 
tblEventTimePeriodRoom (ID, EventTimePeriodId, RoomId) 

關係:

tblEvent to tblEventTimePeriod -> One to many 
tblEventTimePeriod to tblEventTimePeriodRoom -> many to many 

對於這個例子,RoomId可以採取從1值5.在它有40個不同的值實際項目(鍵在其他表格中),我必須在報告中顯示爲列。

我的問題是 - 如何建立快速查詢,如下得到的結果是:

EventId | EventName | RoomId_1 | RoomId_2 | RoomId_3 | RoomId_4 | RoomId_5 

RoomId_X - meens比事件已預留RoomId = X.它沒有哪個tblEventTimePeriod有這個預訂事宜。

實際的解決方案是使用標量UDF(用戶定義函數)來獲取此信息。一開始沒事,但現在執行時間不可接受。實際上,對於每一行(tblEvent)它執行的子查詢將tblEventTimePeriodRoom加入到tblEventTimePeriod中以檢查行是否存在。當報告有40列....沒有評論:)

我會感激任何提示!我正在使用SQL Server 2008 R2。

示例數據:

tblEvent: 
---------- 
Id | Name 
---------- 
1 | Event1 
2 | Event2 
3 | Event3 

tblEventTimePeriod: 
------------ 
Id | EventId 
------------ 
12 | 1 
13 | 2 
14 | 2 
15 | 3 

tblEventTimePeriodRoom 
------------------------------- 
Id | EventTimePeriodId | RoomId 
------------------------------- 
110 | 15 | 1 
111 | 15 | 5 
112 | 13 | 5 
113 | 14 | 2 
114 | 14 | 3 
115 | 14 | 4 
116 | 14 | 5 
117 | 12 | 1 

Result shoud be: 
-------------------------------------------------------------------------- 
EventId | EventName | RoomId_1 | RoomId_2 | RoomId_3 | RoomId_4 | RoomId_5 
-------------------------------------------------------------------------- 
1 | Event1 | 1 | 0 | 0 | 0 | 0 
2 | Event2 | 0 | 1 | 1 | 1 | 1 
3 | Event3 | 0 | 0 | 0 | 0 | 1 

最好的問候!

+1

你能做到在應用程序代碼,而不是在SQL變換? –

+0

您是否試過通過將每個事件加入所有房間來選擇數據,如果房間已預訂或設置了指示符,然後使用PIVOT功能? http://msdn.microsoft.com/en-us/library/ms177410%28v=sql.105%29.aspx – liebs19

+0

@JoeFrambach報告機制正在使用視圖/表值函數來加載數據,所以我嘗試更改實際視圖。如果我沒有找到有趣的解決方案,我將從視圖(或視圖,如果需要)加載初始數據,並按照您的說法進行轉換。謝謝。 – robertw

回答

2

試試這個:

/* outer query formats results */ 
select EventID, EventName, 
case when RoomID = 1 then 1 else 0 end as Room1, 
case when RoomID = 2 then 1 else 0 end as Room2, 
case when RoomID = 3 then 1 else 0 end as Room3, 
case when RoomID = 4 then 1 else 0 end as Room4, 
case when RoomID = 4 then 1 else 0 end as Room5 
from (
      /* inner query makes the joins */ 
      select b.eventid as EventID, a.name as EventName, c.roomid as RoomID 
      from _event a inner join _eventTimePeriod b 
      on a.id = b.eventid 
      inner join _eventTimePeriodRoom c 
      on c.eventtimeperiod = b.id 
) v 
order by EventID 

我希望這可以幫助你..

SQL Fiddle Example

+1

你可能想要添加一個組:) http://sqlfiddle.com/#!2/edcec/ 4/0 – Mr47

+0

這是我第一次使用SQL小提琴...漂亮的小網站應用程序。 – Brian

+0

@briandines我認爲這就是我正在尋找的:)當然,我需要分組,每個事件只有一行。謝謝布萊恩!當我在現實生活中查看時,我會通知你:) – robertw