不带0值的SQL计数条件

不带0值的SQL计数条件,sql,Sql,我正在尝试对SQL运行案例计数,但我希望结果中不包含0。我该怎么做 选择ClubName, 俱乐部类型, 国家,, Concat(计数(当游戏结果为'w%'时为1,否则为空结束),'wins'), 将(当游戏结果为“1%”时,则以1结尾)计算为损失 来自ClubDim、CountryDim、GamesFact 其中ClubDim.CountryID=CountryDim.CountryID 和ClubDim.ClubID=GamesFact.ClubID 按俱乐部名称、俱乐部类型、国家/地区、游

我正在尝试对SQL运行案例计数,但我希望结果中不包含0。我该怎么做

选择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.)