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,所以我在查询中没有得到它.
我的查询有什么问题?我该怎么回来?
这是我的猜测.我认为这比人们一直在转动轮子的所有左/右连接圈都简单得多.由于查询的输出仅依赖于左表中的列,因此根本不需要显式连接:
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谈判,但只显示样本数据中一个表.我的猜测是基于他所说的"工作"但由于显式连接而缺少行的查询.
归档时间: |
|
查看次数: |
2244 次 |
最近记录: |