Как получить общее количество для каждой отдельной категории - PullRequest
0 голосов
/ 12 февраля 2019

Я хотел бы получить неповторяющиеся строки для локаций и получить общее количество игроков в определенных кланах и общее количество звездных игроков.Пожалуйста, см. Ниже для более подробного объяснения

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 голосов
/ 12 февраля 2019

Удалите p.stars из вашего предложения GROUP BY

Это сбивает с толку, потому что устанавливает другое ненужное подразделение ваших группировок.Он появляется только внутри агрегатной (SUM) функции, поэтому он не обязательно должен присутствовать в группе, и ваш sum case when p.stars выполняет правильную работу по подсчету, где игрок является звездой или нет

Если вычтобы лучше понять причину проблемы, поместите p.stars обратно в группу, а также в качестве столбца в select - вы увидите ключи группировки (столбцы, которые не являются агрегатной функцией), и это должно стать очевиднымПочему это привело к появлению разделенных строк, на случай, если он когда-нибудь поднимется (если 11+ звезд не означает, что игрок больше не звездный игрок ...).Также, если столбец имеет тип int, его следует сравнивать с константой int, а не с константной строкой (10 rather than '10')

...