代码之家  ›  专栏  ›  技术社区  ›  BFF

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

  •  1
  • BFF  · 技术社区  · 6 年前

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

    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 回复  |  直到 6 年前
        1
  •  1
  •   Caius Jard    6 年前

    移除 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' )