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