即使为0,也返回计数(*)

m0f*_*0fo 2 sql t-sql sql-server join group-by

我有以下查询:

select bb.Name, COUNT(*) as Num from BOutcome bo 
JOIN BOffers bb ON bo.ID = bb.BOutcomeID 
WHERE bo.EventID = 123 AND bo.OfferTypeID = 321 AND bb.NumA > bb.NumB 
GROUP BY bb.Name
Run Code Online (Sandbox Code Playgroud)

该表看起来像:

Name | Num A | Num B
 A   |   10  |   3
 B   |   2   |   3
 C   |   10  |   3
 A   |   9   |   3
 B   |   2   |   3
 C   |   9   |   3
Run Code Online (Sandbox Code Playgroud)

预期产量应为:

Name | Count
 A   |   2 
 B   |   0  
 C   |   2  
Run Code Online (Sandbox Code Playgroud)

因为当名称是A和C时,Num A比Num B大,当Name是B时,在两个记录中Num A低于Num B.

我目前的输出是:

Name | Count
 A   |   2 
 C   |   2   
Run Code Online (Sandbox Code Playgroud)

因为B的输出为0,所以我在查询中没有得到它.

我的查询有什么问题?我该怎么回来?

Aar*_*and 5

这是我的猜测.我认为这比人们一直在转动轮子的所有左/右连接圈都简单得多.由于查询的输出仅依赖于左表中的列,因此根本不需要显式连接:

SELECT 
  bb.Name, 
  [Count] = SUM(CASE WHEN bb.NumA > bb.NumB THEN 1 ELSE 0 END)
  -- just FYI, the above could also be written as:
  -- [Count] = COUNT(CASE WHEN bb.NumA > bb.NumB THEN 1 END)
FROM dbo.BOffers AS bb
WHERE EXISTS 
(
    SELECT 1 FROM dbo.BOutcome 
    WHERE ID = bb.BOutcomeID
    AND EventID = 123
    AND OfferTypeID = 321
)
GROUP BY bb.Name;
Run Code Online (Sandbox Code Playgroud)

当然,我们还不能真正确保两个名称和NUMA /麻木是在左边的表,距今约两个表中的OP谈判,但只显示样本数据中一个表.我的猜测是基于他所说的"工作"但由于显式连接而缺少行的查询.