首页 > 解决方案 > 如何获取每个不同类别的总数

问题描述

我想获得不重复的位置行,并获得特定部落中玩家的总数以及明星玩家的总数。请参阅下面的更多说明

table p:
player_id    stars
1            10
2            10
3            10
4            10

table a:
player_id    location   clan
1               egate   dragons
2               ngate   sabrelights
3               sgate   dragons
4               wgate   tigers
5               lgate   fireflies
6               lgate   fireflies
7               egate   dragons

这是我尝试过的

    SELECT DISTINCT (CASE SUBSTR (location, 1, 1)
              WHEN 'e' THEN 'East'
              WHEN 'n' THEN 'North'
              WHEN 's' THEN 'South'
              WHEN 'w' THEN 'West'
              WHEN 'l' THEN 'Limbo'
              ELSE null
          END) loc
        ,clan clans  
        , sum (case when a.player_id IS NOT NULL THEN 1 ELSE 0 END) Total
        ,sum (case when p.stars = '10' THEN 1 ELSE 0 END) stars                                                                                            
        FROM   a
             left outer join p on p.PLAYER_ID = a.player_id 
                   group by SUBSTR (location, 1, 1),a.clan, p.STARS
            ,clan
           order by loc, clans

实际结果(错误):

LOC     CLANS    TOTAL  STARS
East    dragons     1   0
East    dragons     1   1
South   dragons     1   1
Limbo   fireflies   2   0
North   sabrelights 1   1
West    tigers      1   1

我想要的(期望的输出):

LOC     CLANS   TOTAL  STARS    
East    dragons     2   1
South   dragons     1   1
Limbo   fireflies   2   0
North   sabrelights 1   1
West    tigers      1   1

标签: sqloracleaggregatedistinct

解决方案


p.stars从您的 GROUP BY 子句中删除

它正在把事情绊倒,因为它正在为你的分组建立另一个不必要的细分。它只出现在聚合 (SUM) 函数中,因此它不必出现在 group by 中,并且您sum case when p.stars正在做正确的工作来计算球员是否是明星

如果您想更好地了解导致问题的原因,请将 p.stars 放回 group by 并作为 select 中的列 - 您将看到分组键(不是聚合函数的列),它应该变得很明显为什么它会导致出现拆分行

如果星星是玩家获得的星星数量的整数计数,您可能需要进行>= 10检查 - 这比等号检查更可靠,以防万一它变得更高(除非 11 颗以上的星星意味着玩家是不再是明星球员..)。此外,如果列是 int,则应与常量 int 而不是常量字符串 ( 10 rather than '10')


推荐阅读