我想获取不重复的位置行,并获取特定部落中球员的总数以及明星球员的总数。请参阅下面的更多说明
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
答案 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'
)进行比较