0

我想从用户表中选择所有用户,并从休假表中选择他们的数据作为开始休假日期和结束日期以获取他们的假期余额,如果用户没有休假返回 0

这是我的查询:

SELECT 
    dbo.USERINFO.USERID,
    dbo.USERINFO.NAME AS إسم_الموظف,
    SUM(DATEDIFF(d, dbo.vacation.STARTSDAY, dbo.vacation.ENDSDAY) + 1) AS عددالايام,
    dbo.userinfo.balance - (SUM(DATEDIFF(d, dbo.vacation.STARTSDAY, dbo.vacation.ENDSDAY) + 1)) AS الرصيد
FROM
    dbo.USERINFO
LEFT JOIN 
    dbo.Vacation ON dbo.Vacation.UserID = dbo.USERINFO.USERID
WHERE 
    dbo.USERINFO.DEFAULTDEPTID <> 7
    AND dbo.vacation.DATEID = 2
    AND year(dbo.vacation.STARTSDAY) = 2020
    AND month(dbo.vacation.STARTSDAY) BETWEEN 1
    AND 12
GROUP BY 
    dbo.USERINFO.userid,
    dbo.USERINFO.NAME,
    dbo.userinfo.balance
4

1 回答 1

1

计算总和时,您需要在 case when 语句中移动条件

SELECT U.USERID,
    U.NAME AS إسم_الموظف,
    ISNULL(SUM(CASE WHEN V.DATEID = 2
                    AND year(V.STARTSDAY) = 2020
                    THEN DATEDIFF(d, V.STARTSDAY, V.ENDSDAY)
                ELSE 0
                END), 0) AS عددالايام,
    ISNULL(U.balance, 0) - ISNULL(SUM(CASE WHEN V.DATEID = 2
                    AND year(V.STARTSDAY) = 2020
                    THEN DATEDIFF(d, V.STARTSDAY, V.ENDSDAY)
                ELSE 0
                END), 0) AS الرصيد
FROM dbo.USERINFO AS U
LEFT JOIN dbo.Vacation AS V ON V.UserID = U.USERID
WHERE U.DEFAULTDEPTID <> 7
GROUP BY U.userid,
    U.NAME,
    U.balance

结果:

+--------+------------+-----------+--------+
| USERID | إسم_الموظف | عددالايام | الرصيد |
+--------+------------+-----------+--------+
| 1      | NAME 1     | 8         | 2      |
+--------+------------+-----------+--------+
| 2      | NAME 2     | 6         | 4      |
+--------+------------+-----------+--------+
| 4      | NAME 4     | 0         | 10     |
+--------+------------+-----------+--------+

用于生成虚拟数据的脚本是:

CREATE TABLE USERINFO (USERID int, NAME VARCHAR(20), BALANCE INT, DEFAULTDEPTID INT)
INSERT INTO USERINFO VALUES
(1, 'NAME 1', 10, 5),
(2, 'NAME 2', 10, 4),
(3, 'NAME 3', 10, 7),
(4, 'NAME 4', 10, 5)

CREATE TABLE Vacation (UserID INT, STARTSDAY DATETIME, ENDSDAY DATETIME, DATEID INT)
INSERT INTO Vacation VALUES
(1, '2020-01-12', '2020-01-20', 2),
(1, '2020-01-22', '2020-01-24', 3),
(2, '2020-01-27', '2020-01-31', 2),
(2, '2020-03-27', '2020-03-29', 2),
(7, '2020-03-27', '2020-03-29', 2)

请注意, UserId 3 已停用,因此它不包含在结果中。

请注意,在计算总和时不包括 DateId 3 的假期

于 2020-12-11T22:17:57.240 回答