Sql 组集不应出现在“如果”;“登记入住”;

Sql 组集不应出现在“如果”;“登记入住”;,sql,sql-server,ssms,Sql,Sql Server,Ssms,因此,我目前有一个非常有效的查询——希望有一点变化我想执行。如果组ID已成功地从不同的站点ID签入,那么该组ID的所有站点ID的全部内容都不应显示在我的查询中(因为我的组ID只是捕获非“签入”窥视) 为了进一步澄清,我将建立一个简单的信息表 Group ID | Site ID | Arrival Time --------------------------------- 12345 | 23456 | 06:00 AM ------------------------------

因此,我目前有一个非常有效的查询——希望有一点变化我想执行。如果组ID已成功地从不同的站点ID签入,那么该组ID的所有站点ID的全部内容都不应显示在我的查询中(因为我的组ID只是捕获非“签入”窥视)

为了进一步澄清,我将建立一个简单的信息表

Group ID | Site ID | Arrival Time
---------------------------------
12345    | 23456   | 06:00 AM 
---------------------------------
12345    | 34567   | NULL
---------------------------------
12345    | 45678   | 06:00 AM 
--------------------------------
67890    | 56789   | 06:30 AM 
因此,基本上您可以将多个站点id分配给一个组id。如上所示,如果该组有到达时间(12345-6 AM),但该组中的一个站点为
NULL
,则即使该日期为
NULL
,该组中的该站点仍应标记为“签入”


现在,我的查询正在拾取该空值,而我根本不希望拾取它,因为它的组有其他已签入的站点

我认为您只需要添加一个
having
子句:

having sum(case when saa.Date is not null then 1 else 0 end) = 0
此外,还有两项建议:

  • select distinct
    几乎不需要使用
    groupby
    。如果它真的在做任何事情,你应该移除它并修复逻辑
  • 使用
    varchar
    时,请始终指定长度。默认长度因上下文而异,因此使用长度是最安全的方法。您的
    convert()
    调用应该类似于
    convert(varchar(255),…)
  • 编辑:

    在这种情况下,我们必须求助于稍微不同的解决方案,仍然使用
    having
    子句。将以下内容添加到
    选择中:

    sum(case when convert(varchar(255), saa.Date, 101) is not null then 1 else 0 end) over (partition by GroupId) as sumgroup
    
    然后将
    having
    子句更改为:

    having sumgroup = 1;
    

    我完全明白你们所说的团体是什么意思。我认为这是由
    groupby
    生成的组。这将基于
    GroupId
    列定义

    左连接
    更改为
    内部连接
    ,以仅返回已签入的连接?(我可能误解了这个问题:D)lol-内部连接不会生成我要查找的未签入行:PI不是要查找“未签入”站点的总和。因此,我不确定sum在这里是如何使用的?这实现了您问题中描述的逻辑:“如果一个组ID从不同的SiteID成功签入,那么该组ID及其所有SiteID的全部内容不应显示在我的查询中”。它统计不为NULL的值的数量,如果有,则过滤掉行。嗯,使用having子句似乎仍然会产生那些NULL值。我几乎保持了一切不变(使用您关于Distinct和Varchar的建议),并在GROUPBY子句之后添加了having子句。
    having sumgroup = 1;