SQL Server中SELECT内子查询运行报错,如何按平台列展示销量前10游戏
错误原因分析
- SELECT子句中的子查询
(SELECT g_name FROM vgsales$ WHERE g_platform = 'X360')没有限制返回行数,会返回对应平台下所有游戏名称,不符合单列单值的表达式要求,因此触发报错 - 你需要的多平台前10游戏横向并列展示的需求,无法通过无关联的独立子查询直接实现
正确实现方案
先通过窗口函数给每个平台的游戏按全球销量排序,再按排序序号做横向拼接即可,实现代码如下:
WITH RankedSales AS ( SELECT g_name, g_platform, Global_Sales, -- 按平台分组,全球销量降序生成排名 ROW_NUMBER() OVER (PARTITION BY g_platform ORDER BY Global_Sales DESC) AS rn FROM vgsales$ ) SELECT x360.g_name AS g_namex360, ps2.g_name AS g_nameps2 FROM (SELECT g_name, rn FROM RankedSales WHERE g_platform = 'X360' AND rn <= 10) x360 -- 按排名序号对齐拼接两个平台的前10游戏 FULL JOIN (SELECT g_name, rn FROM RankedSales WHERE g_platform = 'PS2' AND rn <= 10) ps2 ON x360.rn = ps2.rn ORDER BY COALESCE(x360.rn, ps2.rn);
代码说明
- 采用全外连接可以避免某一平台游戏数量不足10时,另一平台的排名数据被截断的问题
- 如果需要保留销量相同并列排名的场景,可以将
ROW_NUMBER()替换为RANK(),根据实际需求调整筛选条件即可 - 后续需要新增其他平台列时,只需要新增对应平台的子查询关联逻辑即可
内容的提问来源于stack exchange,提问作者Anton
相关产品推荐
相关产品推荐

