如何显式显示count(*)等于0的行

时间:2013-04-08 21:27:24

标签: sql database db2

我在DB2中运行的查询

select  yrb_customer.name, 
        yrb_customer.city, 
        CASE count(*) WHEN 0 THEN 0 ELSE count(*) END as #UniClubs 
from  yrb_member, yrb_customer 
where yrb_member.cid = yrb_customer.cid and yrb_member.club like '%Club%' 
group by yrb_customer.name, yrb_customer.city  order by count(*)

向我展示俱乐部中包含“俱乐部”一词的人,并显示他们所属的俱乐部(#UniClubs)及其名称和城市的数量。然而,对于那些不属于这样一个俱乐部的学生,我仍然希望他们出现,但只有0而不是被隐藏,这就是现在正在发生的事情。我无法使用count(*)获得此功能。有人可以解释一下吗?如果上述内容不够明确,我可以进一步解释。

2 个答案:

答案 0 :(得分:2)

我不熟悉DB2,所以我在黑暗中进行了一次尝试,但试试这个:

select  yrb_customer.name, 
        yrb_customer.city, 
        CASE WHEN yrb_member.club like '%Club% THEN count(*) ELSE 0 END as #UniClubs 
from  yrb_member, yrb_customer 
where yrb_member.cid = yrb_customer.cid
group by yrb_customer.name, yrb_customer.city  order by count(*)

基本上,您不想在WHERE子句中过滤%Club%,因为您希望所有行都返回。

答案 1 :(得分:1)

您将需要LEFT JOIN

SELECT yrb_customer.name, yrb_customer.city,
       COUNT(yrb_member.club) as clubCount
FROM yrb_customer
LEFT JOIN yrb_member
       ON yrb_member.cid = yrb_customer.cid
          AND yrb_member.club LIKE '%Club%
GROUP BY yrb_customer.name, yrb_customer.city
ORDER BY clubCount

另外,如果元组(yrb_customer.nameyrb_customer.city)是唯一的(或者应该是 - 你在计算与同一个人同名的所有学生吗?),你可能会变得更好表现超出以下范围:

SELECT yrb_customer.name, yrb_customer.city,
       COALESCE(club.count, 0)
FROM yrb_customer
LEFT JOIN (SELECT cid, COUNT(*) as count
           FROM yrb_member
           WHERE club LIKE '%Club%
           GROUP BY cid) club
       ON club.cid = yrb_customer.cid
ORDER BY club.count

原始结果被隐藏的原因是因为在原始查询中,您有一个隐式内连接,当然需要匹配行。隐式连接语法(逗号分隔的FROM子句)非常适用于内部(常规)连接,但对于左连接来说是可怕的,这是您真正需要的。隐式连接语法(以及WHERE子句中某些类型的相关过滤)的使用被认为已弃用。