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

求助:如何正确运行给定SQL代码中的最后一条营收聚合查询

酒店营收分组统计查询正确运行方案

原代码存在的运行报错点

  • CTE作用域不匹配:WITH定义的hotels临时结果集,仅对定义后紧邻的第一条查询语句生效,原代码在CTE后连续写了3条独立查询,后两条查询无法读取hotels表数据,会触发表不存在的报错。
  • 分组字段名拼写错误:最终查询的SELECT子句中取的到店年份字段为arrival_date_year,但GROUP BY子句中错写为arrival_year,字段名不匹配会触发字段不存在的报错。
  • 合并逻辑存在数据偏差风险:用UNION合并三张表时会自动对全量数据做去重,若存在跨表重复的合法业务记录(比如历史归档数据和年度表重复存储的同一条入住单)会被误删,且UNION的去重排序操作会大幅拖慢大表查询速度,无明确去重需求建议替换为UNION ALL;如果业务要求必须剔除跨表完全重复的记录,再保留UNION即可。

可直接运行的最终统计查询代码

WITH hotels AS (
    SELECT * FROM hotel_revenue_historical_full
    UNION ALL
    SELECT * FROM projects.`db.2019`
    UNION ALL
    SELECT * FROM projects.`2020`
)
SELECT 
    arrival_date_year,
    hotel,
    SUM((stays_in_weekend_nights + stays_in_week_nights) * adr) AS revenue
FROM hotels
GROUP BY arrival_date_year, hotel;

运行前校验提示

  • 确认你使用的SQL引擎支持CTE语法(MySQL 8.0及以上版本、Hive、Spark SQL、PostgreSQL等主流引擎均原生支持)。
  • 先确认三张源表的字段数量、字段顺序、字段类型完全一致,否则合并表时会报字段不匹配的错误。
  • 如果stays_in_weekend_nights、stays_in_week_nights、adr三个字段存在空值,可以在计算时套一层COALESCE(字段名, 0)把空值转为0,避免营收计算结果返回空值,示例写法:SUM((COALESCE(stays_in_weekend_nights,0) + COALESCE(stays_in_week_nights,0)) * COALESCE(adr,0)) AS revenue。
  • 要是需要单独核验临时表全量数据、计算单客入住总夜数,需要把对应查询单独和CTE绑定运行,不要在同一段代码里CTE后接多条独立查询。

内容的提问来源于stack exchange,提问作者Yogini Shrinivas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 17:36:19