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

Sql 如何获得每个不同类别的总计数,sql,oracle,aggregate,distinct,Sql,Oracle,Aggregate,Distinct,我想获得位置的非重复行,并获得特定宗族的玩家总数和明星玩家总数。请参阅下面的更多解释 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

我想获得位置的非重复行,并获得特定宗族的玩家总数和明星玩家总数。请参阅下面的更多解释

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
实际结果(错误):

我想要的(期望输出):


从GROUP BY子句中删除
p.stars

它是绊倒事情,因为它是建立另一个不必要的细分您的分组。它只出现在聚合(SUM)函数中,因此当p.stars正确计算玩家是否为明星时,它不必出现在group by和您的
SUM案例中

如果您想更好地了解这导致问题的原因,请将p.stars放回group by中,并作为select中的一列—您将看到分组键(不是聚合函数的列),并且应该清楚地知道它导致拆分行出现的原因


如果stars是一个玩家已获得的星星数的整数计数,您可能希望将其设置为
=10
检查-这比equals检查更可靠,以防它变得更高(除非11+星星意味着该玩家不再是明星玩家..)。此外,如果列是int,则应将其与常量int而不是常量字符串进行比较(
10而不是“10”

我添加了一些额外的建议和解释感谢您的解释!我会玩转代码,真的很有帮助!
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