Создать временную строку для каждой строки в существующей таблице - PullRequest
1 голос
/ 14 июля 2010

У меня есть две таблицы. В одной таблице у меня есть список комнат в общежитиях с максимальной вместимостью, например:

dorm_building | dorm_room | max_occupancy

Затем у меня есть список учеников и комната, в которой они распределены:

people_id | people_name | dorm_building | dorm_room

Я хочу создать таблицу, в которой есть строка для каждого потенциального пассажира (например, если в комнате пять возможных обитателей, для этой таблицы должно быть пять строк). Затем я хочу присоединить записи студентов к этой таблице. Затем я расскажу об этом с помощью служб Reporting Services, чтобы предоставить визуальную карту того, кто находится в какой комнате и где еще есть пустые места.

Помощь

Ответы [ 2 ]

5 голосов
/ 14 июля 2010
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. Думайте об этом как о сохраненных видах или запросах. Numbers CTE создает последовательный список чисел путем перекрестного соединения любых двух таблиц (я выбрал sys.syscolumns). Это позволяет мне генерировать запрошенные вами строки-заполнители. Функция Row_Number просто создает последовательный список чисел для каждой возвращаемой строки.

В CTE NumberedStudents я также использую функцию Partition By с функцией Row_Number, которая перезапускает нумерацию жителей для каждого dorm_building и dorm_room. Это даст эффективный номер каждому студенту в комнате.

2 голосов
/ 15 июля 2010

Вам на самом деле нужна временная таблица?Почему бы просто не написать довольно простой запрос, например:

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.value - CountRows ()).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...