SQL对比相邻行单元格 统计各国酒店预订晚数排序报错求解
错误原因
- 语法逻辑错误:
CASE表达式仅能返回排序用的对比值,不能在内部直接指定DESC/ASC排序规则 - 函数误用:
LEAD()是窗口函数,不能直接在ORDER BY的条件中这么使用,且你的排序需求完全不需要用到窗口函数 - 关联逻辑问题:当前用
INNER JOIN会过滤掉没有任何预订记录的国家,不符合「列出所有可用国家」的需求 - 规范问题:
GROUP BY C.name可能触发 MySQL 的ONLY_FULL_GROUP_BY错误,更稳妥的做法是按国家表主键C.id分组
正确实现
你的排序需求是「总晚数降序,晚数相同按国家名升序」,直接在 ORDER BY 后按顺序写两个排序规则即可,不需要复杂的 CASE 逻辑。
版本1:包含0预订晚数的所有国家(符合「列出所有可用国家」要求)
SELECT C.name AS country, COALESCE(SUM(R.nights), 0) AS nights FROM Test.Countries AS C LEFT JOIN Test.Hotels AS H ON C.id = H.country_ids LEFT JOIN Test.Reservations AS R ON H.id = R.hotel_ids GROUP BY C.id, C.name ORDER BY nights DESC, C.name ASC;
版本2:仅显示有预订记录的国家
SELECT C.name AS country, SUM(R.nights) AS nights FROM Test.Reservations AS R INNER JOIN Test.Hotels AS H ON R.hotel_ids = H.id INNER JOIN Test.Countries AS C ON C.id = H.country_ids GROUP BY C.id, C.name ORDER BY nights DESC, C.name ASC;
内容的提问来源于stack exchange,提问作者schedulingqs
相关产品推荐
相关产品推荐

