显示具有空值的用户的SQL查询

显示具有空值的用户的SQL查询,sql,sql-server,Sql,Sql Server,我对SQL非常陌生,我对我创建的查询有一个小问题,我所做的是创建一个查询,该查询将创建我们所有员工在特定日期的时间记录的时间摘要,目前该查询工作正常,但我需要它做的是通过一个我们所有用户的列表,不仅仅是根据当天记录时间的用户进行过滤 SELECT SUM(CASE WHEN TimeTransactions.ChargeBasis = 'C' THEN TimeTransactions.QuantityOfTime/60/6 ELSE 0 END) AS ChargableUnits,

我对SQL非常陌生,我对我创建的查询有一个小问题,我所做的是创建一个查询,该查询将创建我们所有员工在特定日期的时间记录的时间摘要,目前该查询工作正常,但我需要它做的是通过一个我们所有用户的列表,不仅仅是根据当天记录时间的用户进行过滤

SELECT
    SUM(CASE WHEN TimeTransactions.ChargeBasis = 'C' THEN TimeTransactions.QuantityOfTime/60/6 ELSE 0 END) AS ChargableUnits,
    SUM(CASE WHEN TimeTransactions.ChargeBasis = 'N' THEN TimeTransactions.QuantityOfTime/60/6 ELSE 0 END) AS NonChargableUnits,
    SUM(CASE WHEN TimeTransactions.ChargeBasis = 'C' THEN TimeTransactions.ValueOfTime ELSE 0 END) AS ChargableValue,   
    SUM(CASE WHEN TimeTransactions.ChargeBasis = 'N' THEN TimeTransactions.ValueOfTime ELSE 0 END) AS NonChargableValue,
    SUM(TimeTransactions.QuantityOfTime)/60/6 AS TotalUnits,
    SUM(TimeTransactions.ValueOfTime) AS TotalValue,
    Users.Code AS FeeEarner
FROM
    Users INNER JOIN TimeTransactions ON TimeTransactions.FeeEarnerRef = Users.Code
WHERE
Users.FeeEarner = 1 AND Users.UserStatus = 0 AND
 TimeTransactions.TransactionDate >= dateadd(day,datediff(day,1,GETDATE()),0)
 AND TimeTransactions.TransactionDate < dateadd(day,datediff(day,0,GETDATE()),0)
GROUP BY
    Users.Code
选择
总和(当TimeTransactions.ChargeBasis='C'然后TimeTransactions.QuantityOfTime/60/6 ELSE 0结束时的情况)作为ChargableUnits,
总和(当TimeTransactions.ChargeBasis='N'然后TimeTransactions.QuantityOfTime/60/6 ELSE 0结束时的情况)作为非收费单位,
总和(当TimeTransactions.ChargeBasis='C'然后TimeTransactions.ValueOfTime ELSE 0结束时的情况)作为ChargableValue,
总和(当TimeTransactions.ChargeBasis='N'然后TimeTransactions.ValueOfTime ELSE 0结束时的情况)作为非计费值,
总和(TimeTransactions.QuantityOfTime)/60/6作为总单位,
总和(TimeTransactions.ValueOfTime)作为总值,
用户。代码为feeerner
从…起
用户内部加入TimeTransactions上的TimeTransactions.feeerErref=Users.Code
哪里
Users.feeerner=1和Users.UserStatus=0和
TimeTransactions.TransactionDate>=dateadd(天,datediff(天,1,GETDATE()),0)
和TimeTransactions.TransactionDate
我希望它能向那些当天没有进行时间记录的用户显示每一行显示“NULL”,而不是将它们从表中删除


任何帮助或指导都将不胜感激:)

像这样的东西就可以了

使用CTE构建用户查询,并将用户相关的筛选条件放在其中,然后将其加入到时间表中,并在其中应用时间筛选条件。这避免了将两张原始表格左连接,然后将过滤器应用于右表格,从而强制在引擎盖下进行内部连接

编辑:

这是一个你正在努力实现的工作示例。我已经大大简化了表结构,因为提供的查询中引用的列与图像示例中提供的列不匹配。此外,查询似乎试图在where子句中使用列别名(这在SQL server中是不可能的)

在下面的示例中,我在公共表表达式中对timetransaction表应用了过滤,然后将用户表左键连接到该表。这将产生以下输出

您可以看到,如果用户的时间事务与筛选条件不匹配,则返回零,此时使用内部联接将根本不会返回这些用户

通过更全面的数据示例(表示列结构和预期输出或类似的内容),我们可以找到一个更接近于剪切和粘贴就绪的解决方案,而这个示例就是,我将如何构造左侧联接的示例,其中需要在联接右侧的表中进行过滤

祝你好运,如果你有任何问题,请告诉我

declare @users table (
    userid int identity(1,1),
    username nvarchar(50)
);

declare @timetransaction table (
    timetransactionid int identity(1,1),
    userid int,
    quantityoftime int
);

insert @users
values
('SomeBody'),
('AnyBody'),
('SomeoneElse');

insert @timetransaction
values
(1, 7),
(1, 12),
(2, 5),
(3, 71),
(3, 4);

declare @userid int = 1;

with timetransaction as (select userid, quantityoftime from @timetransaction where userid=1)

select u.userid, coalesce(SUM(quantityoftime), 0) as total from @users u
left join timetransaction t on u.userid=t.userid
group by u.userid;
用户表示例

时间事务表示例

像这样的东西就可以了

使用CTE构建用户查询,并将用户相关的筛选条件放在其中,然后将其加入到时间表中,并在其中应用时间筛选条件。这避免了将两张原始表格左连接,然后将过滤器应用于右表格,从而强制在引擎盖下进行内部连接

编辑:

这是一个你正在努力实现的工作示例。我已经大大简化了表结构,因为提供的查询中引用的列与图像示例中提供的列不匹配。此外,查询似乎试图在where子句中使用列别名(这在SQL server中是不可能的)

在下面的示例中,我在公共表表达式中对timetransaction表应用了过滤,然后将用户表左键连接到该表。这将产生以下输出

您可以看到,如果用户的时间事务与筛选条件不匹配,则返回零,此时使用内部联接将根本不会返回这些用户

通过更全面的数据示例(表示列结构和预期输出或类似的内容),我们可以找到一个更接近于剪切和粘贴就绪的解决方案,而这个示例就是,我将如何构造左侧联接的示例,其中需要在联接右侧的表中进行过滤

祝你好运,如果你有任何问题,请告诉我

declare @users table (
    userid int identity(1,1),
    username nvarchar(50)
);

declare @timetransaction table (
    timetransactionid int identity(1,1),
    userid int,
    quantityoftime int
);

insert @users
values
('SomeBody'),
('AnyBody'),
('SomeoneElse');

insert @timetransaction
values
(1, 7),
(1, 12),
(2, 5),
(3, 71),
(3, 4);

declare @userid int = 1;

with timetransaction as (select userid, quantityoftime from @timetransaction where userid=1)

select u.userid, coalesce(SUM(quantityoftime), 0) as total from @users u
left join timetransaction t on u.userid=t.userid
group by u.userid;
用户表示例

时间事务表示例

您应该使用
左连接。但获得正确的过滤条件非常重要:

SELECT SUM(CASE WHEN tt.ChargeBasis = 'C' THEN tt.QuantityOfTime/60/6 ELSE 0 END) AS ChargableUnits,
       SUM(CASE WHEN tt.ChargeBasis = 'N' THEN tt.QuantityOfTime/60/6 ELSE 0 END) AS NonChargableUnits,
       SUM(CASE WHEN tt.ChargeBasis = 'C' THEN tt.ValueOfTime ELSE 0 END) AS ChargableValue,   
       SUM(CASE WHEN tt.ChargeBasis = 'N' THEN tt.ValueOfTime ELSE 0 END) AS NonChargableValue,
       SUM(tt.QuantityOfTime)/60/6 AS TotalUnits,
       SUM(tt.ValueOfTime) AS TotalValue,
       u.Code AS FeeEarner
FROM Users u LEFT JOIN
     TimeTransactions tt
     ON tt.FeeEarnerRef = u.Code AND
        tt.TransactionDate >= dateadd(day, -1, CONVERT(date, GETDATE())) AND
        tt.TransactionDate < CONVERT(date, GETDATE())
WHERE u.FeeEarner = 1 AND u.UserStatus = 0 
GROUP BY u.Code;
选择SUM(当tt.ChargeBasis='C'然后tt.QuantityOfTime/60/6否则0结束时的情况)作为ChargableUnits,
总和(当tt.ChargeBasis='N'时,则tt.QuantityOfTime/60/6,否则0结束)作为不可收费单位,
总和(当tt.ChargeBasis='C'然后tt.ValueOfTime ELSE 0结束时的情况)作为ChargableValue,
总和(tt.ChargeBasis='N'然后tt.ValueOfTime ELSE 0 END时的情况)作为非计费值,
总和(tt.QuantityOfTime)/60/6作为总单位,
总和(tt.ValueOfTime)作为总值,
u、 代码为feeener
从用户u左加入
TimeTT
关于tt.feeernerref=u.代码和
tt.TransactionDate>=dateadd(day,-1,CONVERT(date,GETDATE())和
tt.TransactionDate
注:

  • TimeTransactions
    上的条件需要放在
    on
    子句中,而不是
    WHERE
  • SQL Server支持
    日期
    数据t