如何获得每个不同类别的总数

How to get the total count for each distinct category

我想获取位置的非重复行,并获取特定战队的玩家总数和明星玩家的总数。更多解释请看下方

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

从 GROUP BY 子句中删除 p.stars

它把事情搞砸了,因为它正在对您的分组建立另一个不必要的细分。它只出现在聚合 (SUM) 函数中,因此它不必出现在分组依据中,并且你的 sum case when p.stars 正在做正确的工作来计算玩家是否是明星

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

如果 stars 是玩家获得的星星数的整数,您可能希望将其设为 >= 10 检查 - 这比 equals 检查更可靠,以防万一更高(除非 11+ 星意味着玩家不再是明星玩家..)。此外,如果列是 int,则应与常量 int 而不是常量字符串 (10 rather than '10')

进行比较