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

时间:2019-02-12 05:47:55

标签: 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               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

1 个答案:

答案 0 :(得分:1)

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

它使事情更加艰难,因为它正在为您的分组建立另一个不必要的细分。它仅显示在汇总(SUM)函数中,因此不必在分组依据中显示,并且您的sum case when p.stars所做的正确工作是计算玩家是否为明星

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

如果星数是玩家赢得的星数的整数,则您可能希望将其设为>= 10支票-这比等额支票更坚固,以防万一它更高(除非11个以上的星级代表该玩家不再是星级玩家。)。另外,如果列是int,则应将其与常量int而不是常量字符串(10 rather than '10')进行比较