求助:如何正确运行给定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
相关产品推荐
相关产品推荐

