Как отобразить только ту горничную, которая доступна с датой?SQL SERVER - PullRequest
0 голосов
/ 01 июля 2019

У меня есть таблица Maid, в которой хранятся данные горничной и таблица встреч, в которой хранятся детали встречи, такие как каждая встреча, которой назначена горничная, поэтому таблица встреч содержит идентификатор горничной. Как отобразить только горничную, которая еще не назначена для какой-либо работы (доступна горничная) и дату, когда горничная доступна?

Настольная горничная

enter image description here

Назначение стола

enter image description here

Что я сделал.

SELECT Maid_ID FROM Maid
EXCEPT
SELECT WO_MaidName FROM Appointments

Учитывая пользовательский ввод 2019-06-03, я хочу этот результат:

Maid_ID    Available Date
--------------------------
   2        2019-06-03
   3        2019-06-03
   5        2019-06-03

Ответы [ 4 ]

1 голос
/ 01 июля 2019

Вы пробовали это?

SELECT Maid_ID 
FROM Maid LEFT JOIN Appointments
    ON Maid.Maid_ID = Appointments.WO_MaidName
WHERE Appointments.WO_MaidName IS NULL

Этот запрос возвращает все строки из таблицы Maid без каких-либо строк, связанных с таблицей встреч.

SELECT Maid_ID
FROM Maid
WHERE Maid_ID NOT IN (
    SELECT WO_MaidName
    FROM Appointments
    WHERE Appointment_DateTime BETWEEN '20190603' AND '20190604')

Этот второй запрос возвращает все строки Maid снет Назначения между датами в предложении where.

0 голосов
/ 02 июля 2019

В конце попробуйте, пожалуйста:

-- Create a Temporary table for keep Maid_Id and AppointmentDateTime
CREATE TABLE #TEMP 
    (
        Maid_Id INT,
        AppointmentDateTime DATETIME
    )


-- Select all AppointmentDateTime are present in Appointment
DECLARE db_cursor CURSOR FOR SELECT distinct Appointment.AppointmentDateTime FROM Appointment; 


-- Iterate them to insert them into the temporary table
DECLARE @date datetime;
OPEN db_cursor;
FETCH NEXT FROM db_cursor INTO @date;
WHILE @@FETCH_STATUS = 0  
BEGIN  
        INSERT INTO #TEMP (Maid_Id, AppointmentDateTime)
        SELECT M.Maid_Id, @date FROM Maid M
        WHERE M.Maid_Id NOT IN (
            SELECT a.Maid_Id FROM Appointment a
            WHERE A.AppointmentDateTime = @date
        )

       FETCH NEXT FROM db_cursor INTO @date;
END;
CLOSE db_cursor;
DEALLOCATE db_cursor;


-- Create another temporary table to keep all the dates we need
DECLARE @MinDate DATE = '2019-05-10',
        @MaxDate DATE = '2019-07-24';
CREATE TABLE #DATES 
    (
        [DATE] DATETIME
    )


-- Create a range of dates that we need and insert them in the temporary table. It can cover a wide range of dates like 2000-01-01 to Now
INSERT INTO #DATES
SELECT  TOP (DATEDIFF(DAY, @MinDate, @MaxDate) + 1)
        Date = DATEADD(DAY, ROW_NUMBER() OVER(ORDER BY A.OBJECT_ID) - 1, @MinDate)
FROM    SYS.ALL_OBJECTS A
CROSS JOIN SYS.ALL_OBJECTS B;


-- Union all the data
SELECT M.Maid_Id, M.Maid_Name, CONVERT(NVARCHAR(10), T.AppointmentDateTime, 120) [date] FROM #TEMP T
INNER JOIN Maid M ON T.Maid_Id = M.Maid_Id
UNION
SELECT null, 'All People Are Free', CONVERT(NVARCHAR(10), [DATE], 120) FROM #DATES
ORDER BY [date]


DROP TABLE #TEMP
DROP TABLE #DATES

Результат примерно такой:

enter image description here

0 голосов
/ 02 июля 2019

Другое решение состоит в том, чтобы использовать конкретную дату и называть ее на каждой дате, какой вы хотите. Сначала добавьте Table-valued Function в SqlServer, например:

CREATE FUNCTION [dbo].[MyFunction]
(   
    @date datetime
)
RETURNS TABLE 
AS
RETURN 
(
    SELECT M.Maid_Id FROM Maid M
            WHERE M.Maid_Id NOT IN (
                SELECT a.Maid_Id FROM Appointment a
                WHERE A.AppointmentDateTime = @date
            )
)

А потом назовите это так:

DECLARE @Date DATETIME = '2019-05-15 00:00:00.000'; // Put the date you want
SELECT m.Maid_Id, m.Maid_Name, @Date FROM Maid M
INNER JOIN [dbo].[MyFunction](@Date) F ON M.Maid_Id = F.Maid_Id

enter image description here

0 голосов
/ 01 июля 2019

Возможно, это не оптимизировано, но работает.

CREATE TABLE #TEMP 
    (
        Maid_Id INT,
        AppointmentDateTime DATETIME
    )

DECLARE db_cursor CURSOR FOR SELECT distinct Appointment.AppointmentDateTime FROM Appointment; 
DECLARE @date datetime;
OPEN db_cursor;
FETCH NEXT FROM db_cursor INTO @date;
WHILE @@FETCH_STATUS = 0  
BEGIN  
        INSERT INTO #TEMP (Maid_Id, AppointmentDateTime)
        SELECT M.Maid_Id, @date FROM Maid M
        WHERE M.Maid_Id NOT IN (
            SELECT a.Maid_Id FROM Appointment a
            WHERE A.AppointmentDateTime = @date
        )

       FETCH NEXT FROM db_cursor INTO @date;
END;
CLOSE db_cursor;
DEALLOCATE db_cursor;

SELECT T.Maid_Id, M.Maid_Name, T.AppointmentDateTime FROM #TEMP T
INNER JOIN Maid M ON T.Maid_Id = M.Maid_Id
ORDER BY AppointmentDateTime

DROP TABLE #TEMP

enter image description here

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