как я могу узнать общее количество выходных по сотруднику - PullRequest
0 голосов
/ 05 мая 2020

У меня есть эти таблицы Holiday (Id, FK (EmployeeId), StartDate, EndDate) и таблица Employee (Id, FullName, et c ...)

Я хочу знать количество дней что у каждого сотрудника есть

Я пробовал что-то вроде этого:

SELECT Employee.Id, SUM(DATEDIFF(day,Holiday.StartDate,Holiday.EndDate) + 1)
FROM Employee
LEFT JOIN Holiday ON Holiday.EmployeeId=Employee.Id
GROUP BY Employee.id

Я знаю, что это не сработает, потому что, чтобы суммировать, необходимо сгруппировать по Holiday.Id, поскольку у меня будет много строк в таблице Holiday для одного и того же EmployeeId

как я могу выполнить sh это?

спасибо за помощь

Ответы [ 3 ]

1 голос
/ 05 мая 2020

Или, используя вычисление рабочего дня, которое я нашел здесь: https://www.sqlshack.com/how-to-calculate-work-days-and-hours-in-sql-server, вы можете сделать следующее:

CREATE FUNCTION workingdays ( @DateFrom Date, @DateTo Date) RETURNS INT AS
BEGIN
    DECLARE @TotDays INT= DATEDIFF(DAY, @DateFrom, @DateTo) + 1;
    DECLARE @TotWeeks INT= DATEDIFF(WEEK, @DateFrom, @DateTo) * 2;
    DECLARE @IsSunday INT= CASE
                         WHEN DATENAME(WEEKDAY, @DateFrom) = 'Sunday'
                         THEN 1
                         ELSE 0
                      END;
    DECLARE @IsSaturday INT= CASE
                           WHEN DATENAME(WEEKDAY, @DateTo) = 'Saturday'
                           THEN 1
                           ELSE 0
                        END;
    DECLARE @TotWorkingDays INT= @TotDays - @TotWeeks - @IsSunday + @IsSaturday;
    RETURN @TotWorkingDays;
END
GO

create table Employee (Id int identity, name varchar(64), Primary Key (Id));
create table Holiday (EmployeeId int, StartDate date, EndDate date);

insert into Employee VALUES ('Harry Potter'),('Hermiony Granger'),('Ron Weasly'),('Ginny Weasley');
insert into Holiday VALUES (1,'2020-02-12','2020-02-18'),(1,'2020-04-02','2020-04-07'),(1,'2020-08-21','2020-09-05'),
  (2,'2020-01-04','2020-01-13'),(2,'2020-03-17','2020-03-23'),(2,'2020-05-29','2020-06-7');


SELECT Employee.Id, SUM(dbo.workingdays(Holiday.StartDate,Holiday.EndDate))
FROM Employee
LEFT JOIN Holiday ON Holiday.EmployeeId=Employee.Id
GROUP BY Employee.id

Это будет только приблизительная оценка, поскольку она не учитывает для publi c праздников.

DEMO: https://rextester.com/QKGUT41272

0 голосов
/ 05 мая 2020

Я пробовал использовать подзапрос. Пожалуйста, используйте запрос ниже. Будет полезно.

SELECT Id, SUM(leave) AS leave
FROM
(
    SELECT Employee.Id, DATEDIFF(dd,Holiday.StartDate,Holiday.EndDate) as leave
    FROM Employee
    LEFT JOIN Holiday ON Holiday.EmployeeId=Employee.Id
)a
GROUP BY ID
0 голосов
/ 05 мая 2020

Привет, я думаю, вы можете создать запрос с использованием CTE следующим образом:

Ресурс: CTE Microsoft: https://docs.microsoft.com/fr-fr/sql/t-sql/queries/with-common-table-expression-transact-sql?view=sql-server-ver15

Или используя форму select in clause

РЕДАКТИРОВАТЬ: Или он работает с вашим текущим запросом на

create Table #EMPLOYEE
(
    EMP_ID INT,
    EMP_NAME varchar(128)
)

create Table #HOLIDAYS
(
    HL_ID INT,
    HL_EMP varchar(128),
    StartDate DATE,
    EndDate DATE
)

Insert into #EMPLOYEE
(
    EMP_ID,
    EMP_NAME
)

SELECT 1, 'Toto'
UNION ALL 
SELECT 2,'Dupont'
UNION ALL 
SELECT 3,'Titi'
UNION ALL 
SELECT 4,'Tata'

Insert into #HOLIDAYS
(
    HL_ID,
    HL_EMP,
    StartDate,
    EndDate
)

SELECT '1', '1',GETDATE(),DATEADD(day,4,GETDATE())
UNION ALL 
SELECT '2','1',DATEADD(day,-7,GETDATE()), DATEADD(day,-5,GETDATE())
UNION ALL 
SELECT '3','2',DATEADD(day,4,GETDATE()),DATEADD(day,15,GETDATE())


-- USING CTE EXEMPLE 
;WITH MyCteAPP AS (
    SELECT EMP_ID, EMP_NAME, HL_ID, ISNULL(StartDate,GETDATE()) AS 'StartDate', ISNULL(EndDate,GETDATE()) AS 'EndDate'
    FROM #EMPLOYEE
        LEFT JOIN #HOLIDAYS ON EMP_ID = HL_EMP
)
SELECT EMP_ID, EMP_NAME, SUM(DATEDIFF(day,StartDate,EndDate)) AS 'NbDay'
FROM MyCteAPP
GROUP BY EMP_ID,EMP_NAME
ORDER BY EMP_ID


-- USING SELECT IN FROM EXEMPLE 
SELECT EMP_ID, EMP_NAME, SUM(DATEDIFF(day,StartDate,EndDate)) AS 'NbDay'
FROM (SELECT EMP_ID, EMP_NAME, HL_ID, ISNULL(StartDate,GETDATE()) AS 'StartDate', ISNULL(EndDate,GETDATE()) AS 'EndDate'
    FROM #EMPLOYEE
        LEFT JOIN #HOLIDAYS ON EMP_ID = HL_EMP
) AS SUBQUERY
GROUP BY EMP_ID,EMP_NAME
ORDER BY EMP_ID

--USING CURRENT QUERY 
SELECT EMP_ID, EMP_NAME, SUM(DATEDIFF(day,ISNULL(StartDate,GETDATE()),ISNULL(EndDate,GETDATE()))) AS 'NbDay'
    FROM #EMPLOYEE
        LEFT JOIN #HOLIDAYS ON EMP_ID = HL_EMP
GROUP BY EMP_ID,EMP_NAME
ORDER BY EMP_ID

DROP TABLE  #EMPLOYEE
DROP TABLE  #HOLIDAYS

РЕЗУЛЬТАТ: enter image description here

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