我有两张桌子。在一张桌子上,我有一份宿舍房间清单,最大入住率如下:
dorm_building | dorm_room | max_occupancy
然后我有一份学生名单和他们被分配到的房间:
people_id | people_name | dorm_building | dorm_room
我想创建一个每个潜在占用者都有一行的表(例如,如果一个房间有五个可能的占用者,那么该表应该有五行)。然后我想将学生记录加入此表。然后,我将使用Reporting Services将其吐出来,以提供一个可视地图,显示谁在哪个房间以及哪些空白点仍然可用。
帮助?
答案 0 :(得分: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及更高版本中可用。第一个是common-table表达式或简称CTE,第二个是排名函数(在本例中为Row_Number)。公用表表达式是Numbers
表和NumberedStudents
表。将这些视为已保存的视图或查询。 Numbers
CTE通过交叉连接任意两个表来创建一个连续的数字列表(我选择了sys.syscolumns)。这使我能够生成您请求的“占位符”行。 Row_Number函数只为返回的每一行创建一个连续的数字列表。
在NumberedStudents CTE中,我还使用带有Row_Number函数的Partition By
功能,该功能重新开始每个dorm_building和dorm_room的占用者编号。这将有效地为房间中的每个学生提供一个序号。
答案 1 :(得分: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分组,详细信息行报告占用情况,以及报告空置位置的组合(Fields!max_occupancy.value - CountRows())。