为现有表中的每一行创建临时行

时间:2010-07-14 19:45:15

标签: sql sql-server sql-server-2008 reporting-services

我有两张桌子。在一张桌子上,我有一份宿舍房间清单,最大入住率如下:

dorm_building | dorm_room | max_occupancy

然后我有一份学生名单和他们被分配到的房间:

people_id | people_name | dorm_building | dorm_room

我想创建一个每个潜在占用者都有一行的表(例如,如果一个房间有五个可能的占用者,那么该表应该有五行)。然后我想将学生记录加入此表。然后,我将使用Reporting Services将其吐出来,以提供一个可视地图,显示谁在哪个房间以及哪些空白点仍然可用。

帮助?

2 个答案:

答案 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())。