如何获得每个不同类别的总数
How to get the total count for each distinct category
我想获取位置的非重复行,并获取特定战队的玩家总数和明星玩家的总数。更多解释请看下方
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
从 GROUP BY 子句中删除 p.stars
它把事情搞砸了,因为它正在对您的分组建立另一个不必要的细分。它只出现在聚合 (SUM) 函数中,因此它不必出现在分组依据中,并且你的 sum case when p.stars
正在做正确的工作来计算玩家是否是明星
如果您想更好地了解这导致问题的原因,请将 p.stars 放回分组依据并作为 select 中的一列 - 您会看到分组键(列这不是聚合函数)并且它导致拆分行出现的原因应该很明显
如果 stars 是玩家获得的星星数的整数,您可能希望将其设为 >= 10
检查 - 这比 equals 检查更可靠,以防万一更高(除非 11+ 星意味着玩家不再是明星玩家..)。此外,如果列是 int,则应与常量 int 而不是常量字符串 (10 rather than '10'
)
进行比较
我想获取位置的非重复行,并获取特定战队的玩家总数和明星玩家的总数。更多解释请看下方
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
从 GROUP BY 子句中删除 p.stars
它把事情搞砸了,因为它正在对您的分组建立另一个不必要的细分。它只出现在聚合 (SUM) 函数中,因此它不必出现在分组依据中,并且你的 sum case when p.stars
正在做正确的工作来计算玩家是否是明星
如果您想更好地了解这导致问题的原因,请将 p.stars 放回分组依据并作为 select 中的一列 - 您会看到分组键(列这不是聚合函数)并且它导致拆分行出现的原因应该很明显
如果 stars 是玩家获得的星星数的整数,您可能希望将其设为 >= 10
检查 - 这比 equals 检查更可靠,以防万一更高(除非 11+ 星意味着玩家不再是明星玩家..)。此外,如果列是 int,则应与常量 int 而不是常量字符串 (10 rather than '10'
)