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