2010-07-14 50 views
1

我有兩個表。在一個表我的宿舍有最多可容納像這樣的列表:爲現有表中的每一行創建臨時行

dorm_building | dorm_room | max_occupancy 

然後,我有個同學的名單,他們被分配到喜歡這個房間:

people_id | people_name | dorm_building | dorm_room 

我想爲每個潛在的居住者創建一張表格(例如,如果一個房間有五個可能的居住者,則該表應該有五行)。然後我想將這些學生記錄加入到這張表中。然後,我將使用Reporting Services將其吐出,以提供關於誰在哪個房間以及哪些空白點仍然可用的視覺映射。

幫助?

回答

5
With Numbers As 
    (
    Select Row_Number() Over (Order By C1.object_id) As Value 
    From sys.syscolumns As C1 
     Cross Join sys.syscolumns As C2 
    ) 
    , NumberedStudents As 
    (
    Select people_id, people_name, dorm_building, dorm_room 
     , Row_Number() Over (Partition By dorm_building, dorm_room Order By people_id) As OccupantNum 
    From Students 
    ) 
Select ... 
From DormRooms 
    Join Numbers 
     On N.Value <= DormRooms.max_occupancy 
    Left Join NumberedStudents 
     On NumberedStudents.dorm_building = DormRooms.dorm_building 
      And NumberedStudents.dorm_room = DormRooms.dorm_room 
      And NumberedStudents.OccupantNum= Numbers 

我在此解決方案中使用了SQL Server 2005及更高版本中提供的兩個功能。第一種是公用表表達式或CTE,第二種是排名函數(在這種情況下是Row_Number)。通用表表達式是Numbers表和NumberedStudents表。將這些視爲保存的視圖或查詢。CTE通過交叉連接任意兩個表(我選擇了sys.syscolumns)來創建數字的順序列表。這使我能夠生成您請求的「佔位符」行。 Row_Number函數只是爲返回的每一行創建一個順序數字列表。

在NumberedStudents CTE中,我還使用了Row_Number函數的Partition By功能,該功能重新啓動每個dorm_building和dorm_room的佔用者編號。這將有效地給房間裏的每個學生一個連續的編號。

+0

謝謝。這應該工作。我想知道是否可以這樣做(僞): 對於(select * from dorms)中的每一行 i = 0 if i <= row.maximum_occupants then insert into #temp row.dorm_name,i end if Next – davemackey 2010-07-14 20:19:15

+0

@davemackey - 一般來說,如果您絕對必須這樣做,並且只有在沒有基於集合的解決方案時纔會發生,您只需要在SQL中採用迭代解決方案。在這種情況下,我認爲你確實有一套基於解決方案的解決方案,所以我會首先解決這個問題。 – Thomas 2010-07-15 04:12:04

2

你其實需要的臨時表嗎?爲什麼不只是寫一個相當簡單的查詢,像:

select dr.dorm_building, dr.dorm_room, dr.max_occupancy, ra.people_id, ra.people_name 
from dorm_room_table dr left join room_assignment_table ra 
on dr.dorm_building = ra.dorm_building and dr.dorm_room = ra.dorm_room 

然後使用一個表,通過dorm_room和dorm_building分組,從細節行報告佔用和一組基礎報告空置的地方(場max_occupancy!值 - CountRows())。