You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

查询售票总数最高的影院:SQL缺失影院6的问题排查及修正

问题排查与解决:售票最高影院查询缺失记录

问题背景

  • 需求:找出售票总数最高的影院,售票分为official和retail两部分,无对应记录则视为0
  • 涉及两张表:
    • Official表(字段:Cinema、Date、OfficialSold)
    • Retail表(字段:Cinema、Date、RetailSold)
  • 异常情况:期望输出包含售票总数为30的影院4、5、6,但当前查询仅返回4、5,缺失影院6

错误原因

你用LEFT JOIN以Official表为基准关联Retail表,这会直接过滤掉只在Retail表有记录、完全没出现在Official表的影院(比如影院6)——这类影院根本不会进入CombinedTickets临时表,自然不会出现在最终结果里。

正确实现代码

先获取所有存在的影院ID(覆盖两个表的所有影院),再分别关联两个表统计售票总数,确保没有遗漏:

WITH AllCinemas AS (
    -- 提取所有存在的影院ID,自动去重
    SELECT Cinema FROM Official
    UNION
    SELECT Cinema FROM Retail
),
CombinedTickets AS (
    SELECT
        ac.Cinema,
        COALESCE(SUM(o.OfficialSold), 0) AS OfficialSold,
        COALESCE(SUM(r.RetailSold), 0) AS RetailSold,
        COALESCE(SUM(o.OfficialSold), 0) + COALESCE(SUM(r.RetailSold), 0) AS TotalTickets
    FROM AllCinemas ac
    LEFT JOIN Official o ON ac.Cinema = o.Cinema
    LEFT JOIN Retail r ON ac.Cinema = r.Cinema
    GROUP BY ac.Cinema
),
MaxTickets AS (
    SELECT MAX(TotalTickets) AS MaxTotal FROM CombinedTickets
)
SELECT
    Cinema,
    OfficialSold,
    RetailSold,
    TotalTickets
FROM CombinedTickets
CROSS JOIN MaxTickets
WHERE TotalTickets = MaxTotal
ORDER BY Cinema;

关键说明

  • UNION用来合并两个表的影院ID并去重,确保所有影院都被纳入统计
  • 用SUM是因为同一个影院可能有多条日期的售票记录,需要累加总数;如果需求是单日统计,去掉SUM并按Cinema, Date分组即可
  • 两次LEFT JOIN保证不管影院在哪个表有记录,都能被统计到,无记录的部分自动用0填充

内容的提问来源于stack exchange,提问作者heihei Li

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 22:33:15