Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 我在SQL Server数据库中有两个表-用户表和假期表_Sql Server - Fatal编程技术网

Sql server 我在SQL Server数据库中有两个表-用户表和假期表

Sql server 我在SQL Server数据库中有两个表-用户表和假期表,sql-server,Sql Server,我想从用户表中选择所有用户,并从休假表中选择他们的数据作为开始休假日期和结束日期,以获取他们的休假余额,如果用户没有休假,则返回0 我的问题是: SELECT dbo.USERINFO.USERID, dbo.USERINFO.NAME AS إسم_الموظف, SUM(DATEDIFF(d, dbo.vacation.STARTSDAY, dbo.vacation.ENDSDAY) + 1) AS عددالايام, dbo.userinfo.balan

我想从用户表中选择所有用户,并从休假表中选择他们的数据作为开始休假日期和结束日期,以获取他们的休假余额,如果用户没有休假,则返回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
选择
dbo.USERINFO.USERID,
dbo.USERINFO.NAME作为,
总和(日期差(d,dbo.vacation.STARTSDAY,dbo.vacation.ENDSDAY)+1)为,
dbo.userinfo.balance-(和(日期差(d,dbo.vacation.STARTSDAY,dbo.vacation.ENDSDAY)+1))作为
从…起
dbo.USERINFO
左连接
dbo.Vacation ON dbo.Vacation.UserID=dbo.USERINFO.UserID
哪里
dbo.USERINFO.DEFAULTDEPTID 7
和dbo.vacation.DATEID=2
年份(dbo.假期.开始日期)=2020年
月(dbo.vacation.STARTSDAY)介于1和
和12
分组
dbo.USERINFO.userid,
dbo.USERINFO.NAME,
dbo.userinfo.balance

计算总和时,需要在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
用于生成虚拟数据的脚本为:

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)
请注意,用户标识3已失效,因此不包括在结果中


请注意,当计算“和”/P>时,不包含包含DATEID 3的< /强>休假。请考虑充分利用WHESE Stand和Load Stand,SQL可能是一个难以理解的混乱。还有,唐;不要对列使用由三部分组成的命名,这将被弃用。为对象设置别名并使用这些对象限定列。你能解释一下问题是什么吗?你没有得到结果还是什么?你能提供一些数据和预期结果吗?我的查询只返回休假表中存在的用户,我希望在休假表中存在时显示所有用户返回那里的数据或不返回0我已在@Mnhlymy下面发布了一个答案更新了一个解释@MnhlyNo,你只需要发布你的问题,你会发现很多人(包括我)愿意帮助你。:)享受@Mnhly的编码
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)