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

Dav*_*key 1 sql sql-server sql-server-2008 reporting-services

我有两张桌子.在一张桌子上,我有一个最多入住的宿舍房间列表,如下所示:

dorm_building | dorm_room | max_occupancy
Run Code Online (Sandbox Code Playgroud)

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

people_id | people_name | dorm_building | dorm_room
Run Code Online (Sandbox Code Playgroud)

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

救命?

Tho*_*mas 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
Run Code Online (Sandbox Code Playgroud)

我正在使用此解决方案中的两个功能,这些功能在SQL Server 2005及更高版本中可用.第一个是common-table表达式或简称CTE,第二个是排名函数(在本例中为Row_Number).公用表表达式是Numbers表和NumberedStudents表.将这些视为已保存的视图或查询.该NumbersCTE创建交叉连接任何两个表(我选择SYS.SYSCOLUMNS)号的顺序列表.这使我能够生成您请求的"占位符"行.Row_Number函数只为返回的每一行创建一个连续的数字列表.

在NumberedStudents CTE中,我还使用了Partition ByRow_Number函数的功能,该功能重新开始每个dorm_building和dorm_room的占用者编号.这将有效地为房间中的每个学生提供一个序号.