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将其吐出来,以提供一个可视地图,显示谁在哪个房间以及哪些空白点仍然可用.
救命?
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的占用者编号.这将有效地为房间中的每个学生提供一个序号.
| 归档时间: |
|
| 查看次数: |
1162 次 |
| 最近记录: |