sql - 如何获取每个不同类别的总数
问题描述
我想获得不重复的位置行,并获得特定部落中玩家的总数以及明星玩家的总数。请参阅下面的更多说明
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
解决方案
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'
)
推荐阅读
- css - 定位视频并使其像图像一样在背景中重复
- asp.net - jqGrid如何动态多选?
- javascript - 在 laravel 中使用 vue.js 按钮单击时无法显示模式
- javascript - 如何在 React Native 中使用 Axios 设置授权标头
- hidden - 忽略 Cweb 中的隐藏文件
- monetdb - COPY INTO 中的 ZIP 支持
- keras - Jupyter notebook 错误“内核似乎已经死机。它将自动重启”
- testing - 数据监控基础设施,以确保数据的完整性
- javascript - 使用javascript同步获取图像
- powershell - 使用 xPath .SelectSingleNode 的 Powershell 脚本无法从 web.config 文件 xmlns 中提取值