Sql 在另一个具有group by的表中添加行存在标志

Sql 在另一个具有group by的表中添加行存在标志,sql,sql-server,boolean-logic,Sql,Sql Server,Boolean Logic,对于下面的查询,我希望有一个名为isHold的标志,它的计算结果为0 如果视图中没有billNo,则onHold表中存在Bills,并且 1否则 select max(t.id) TrackingID , max(vb.billNo) billNo, cb.id , max(case when vb.[count] > 1 then 1 else 0 end) isMultiple , max(case when t.TrackingID = 31 then 1 else 0 end)

对于下面的查询,我希望有一个名为isHold的标志,它的计算结果为0 如果视图中没有billNo,则onHold表中存在Bills,并且 1否则

select max(t.id) TrackingID , max(vb.billNo) billNo, cb.id  ,
max(case when vb.[count] > 1 then 1 else 0 end) isMultiple ,
max(case when t.TrackingID = 31 then 1 else 0 end) IsCancelled,
max(case when exists (select 1 from OnHold oh
where oh.billNo = billNo) then 1 else 0 end) IsHold

from viewBills vb
join tracking t on vb.billNo = t.billNo
join customerBills cb on vb.billNo = cb.billNo 
join customerPieces cp on  cb.id = cp.customerBillId
where cb.statusid <> 3
group by cb.id
这是合理的,但如何实现呢?

您可以使用外部应用或左连接将逻辑移动到FROM子句:

您可以使用外部应用或左连接将逻辑移动到FROM子句:


您可以选择LEFT OUTER JOIN并按如下所示进行聚合:

选择maxt.id TrackingID、maxvb.billNo billNo、cb.id、, 当vb.[count]>1,则1 else 0 end为多个时的最大情况, maxcase当t.TrackingID=31时,则取消1 else 0 end, maxcase当oh.billNo不为空时,则1 else 0 end为空 从viewBills vb 在vb.billNo=t.billNo上连接跟踪t 在vb.billNo=cb.billNo上加入customerBills cb 在cb.id=cp.customerBillId上加入客户部件cp 左外连接保持oh ON oh.billNo=vb.billNo 其中cb.statusid 3 按cb.id分组
您可以选择LEFT OUTER JOIN并按如下所示进行聚合:

选择maxt.id TrackingID、maxvb.billNo billNo、cb.id、, 当vb.[count]>1,则1 else 0 end为多个时的最大情况, maxcase当t.TrackingID=31时,则取消1 else 0 end, maxcase当oh.billNo不为空时,则1 else 0 end为空 从viewBills vb 在vb.billNo=t.billNo上连接跟踪t 在vb.billNo=cb.billNo上加入customerBills cb 在cb.id=cp.customerBillId上加入客户部件cp 左外连接保持oh ON oh.billNo=vb.billNo 其中cb.statusid 3 按cb.id分组
您在选择中有cb.id,但在分组依据中有cp.id。实际上,这是一个输入错误。您可以将其移动到外部应用程序中。您在选择中有cb.id,但在分组依据中有cp.id。实际上,这是一个输入错误。您可以将其移动到外部应用程序中。我如何使用左连接来执行此操作?@Alvaro。我更喜欢使用外部连接而不是左连接,这就是为什么我使用这种方法。我可以知道为什么吗?效率更高吗?@Alvaro。它只选择一行,因此如果存在多个可能的匹配项,则聚合不必做那么多工作。如何使用左连接进行聚合?@Alvaro。我更喜欢使用外部连接而不是左连接,这就是为什么我使用这种方法。我可以知道为什么吗?效率更高吗?@Alvaro。它只选择一行,因此如果存在多个可能的匹配项,则聚合不必做那么多的工作。
Cannot perform an aggregate function on an expression 
containing an aggregate or a subquery.
select max(t.id) as TrackingID , max(vb.billNo) as billNo, cb.id ,
       max(case when vb.[count] > 1 then 1 else 0 end) as isMultiple,
       max(case when t.TrackingID = 31 then 1 else 0 end) as IsCancelled,
       max(case when oh.billNo is not null then 1 else 0 end) as IsHold
from viewBills vb join
     tracking t
     on vb.billNo = t.billNo join
     customerBills cb
     on vb.billNo = cb.billNo  join
     customerPieces cp
     on cb.id = cp.customerBillId outer apply
     (select top (1) oh.*
      from OnHold oh
      where oh.billNo = cb.billNo
     ) oh
where cw.statusid <> 3
group by cb.id;