不带0值的SQL计数条件
我正在尝试对SQL运行案例计数,但我希望结果中不包含0。我该怎么做不带0值的SQL计数条件,sql,Sql,我正在尝试对SQL运行案例计数,但我希望结果中不包含0。我该怎么做 选择ClubName, 俱乐部类型, 国家,, Concat(计数(当游戏结果为'w%'时为1,否则为空结束),'wins'), 将(当游戏结果为“1%”时,则以1结尾)计算为损失 来自ClubDim、CountryDim、GamesFact 其中ClubDim.CountryID=CountryDim.CountryID 和ClubDim.ClubID=GamesFact.ClubID 按俱乐部名称、俱乐部类型、国家/地区、游
选择ClubName,
俱乐部类型,
国家,,
Concat(计数(当游戏结果为'w%'时为1,否则为空结束),'wins'),
将(当游戏结果为“1%”时,则以1结尾)计算为损失
来自ClubDim、CountryDim、GamesFact
其中ClubDim.CountryID=CountryDim.CountryID
和ClubDim.ClubID=GamesFact.ClubID
按俱乐部名称、俱乐部类型、国家/地区、游戏结果分组
拥有俱乐部类型='专业'
这就是代码,我得到了很多零,我的目标是在两个独立的列中计算输赢
您可以尝试下面的查询-
SELECT ClubName,
ClubType,
Country,
CASE WHEN Wins > 0 THEN CONCAT(Wins , ' wins') ELSE NULL END WINS,
loses
FROM (SELECT ClubName,
ClubType,
Country,
Count(case when GameResult like 'w%' then 1 else NULL end) AS Wins,
Count(Case when GameResult like 'l%' then 1 end) AS Losses
FROM ClubDim CLD
JOIN CountryDim COD ON CLD.CountryID = COD.CountryID
JOIN GamesFact GF ON CLD.ClubID = GF.ClubID
where ClubType = 'Professional'
GROUP BY ClubName,ClubType,Country) X;
如果没有样本数据,显然不可能进行测试,但是您应该在此处使用
sum
而不是count
。您的拥有
标准应该是where
子句的一部分,因为您没有对聚合进行筛选。我还建议使用正确的join
语法,这是自1992年以来的标准语法!然而,我怀疑这会给你带来预期的结果
Select ClubName,
ClubType,
Country,
Concat(sum(case when GameResult like 'w%' then 1 else 0 end), ' ','wins'),
Sum(Case when GameResult like 'l%' then 1 else 0 end) AS Losses
from ClubDim,CountryDim,GamesFact
where ClubDim.CountryID = CountryDim.CountryID and ClubDim.ClubID = GamesFact.ClubID
and ClubType = 'Professional'
GROUP BY ClubName,ClubType,Country,GameResult
问题是您已将
gameResult
放入组中
更重要的是,您需要学习正确、明确、标准、可读的JOIN
语法。在WHERE
子句中进行笛卡尔乘积和过滤是很尴尬的。不使用正确的语法是过时的:
select cl.ClubName, cl.ClubType, co.Country,
Concat(Count(case when g.GameResult like 'w%' then 1 else NULL end), ' ', 'wins'),
Count(Case when g.GameResult like 'l%' then 1 end) AS Losses
from ClubDim cl join
CountryDim co
on cl.CountryID = co.CountryID join
GamesFact g
on cl.ClubID = g.ClubID
where cl.ClubType = 'Professional'
group by cl.ClubName, cl.ClubType, co.Country;
此外:
- 请注意表别名的使用。这些应该是表名的缩写
- 我尽了最大努力来限定所有列,因此很清楚它们来自哪些表。当然,你的问题没有提供这些信息,所以这只是猜测
- 聚合前使用
WHERE
子句进行过滤,而不是聚合后使用have
进行过滤。当您想对聚合结果进行筛选(例如COUNT(*)
)时,请使用HAVING
你说的“没有0”是什么意思?你想把它们过滤掉吗?用你正在使用的数据库标记你的问题。不要破坏你的问题。它成功了!非常感谢你!谢谢你的注释,我还在学习sql,所有这些都是自学的,所以这就是为什么它如此混乱的原因。但我只是想问一下,如何编写像这样桥接的查询,以及如何在列名称之前使用缩写(如cl.和co.)