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

SQL存储过程报错:列未在聚合/GROUP BY中,需实现指定月城市均房价

问题解决:SQL分组报错及存储过程修正

错误原因

报错信息:列 'VacationsTable.StartDate' 在选择列表中无效,因为它未包含在聚合函数或 GROUP BY 子句中。
这是SQL分组规则的限制:使用GROUP BY时,SELECT子句里所有未被聚合函数包裹的列,必须出现在GROUP BY子句中。你的代码里StartDate、EndDate既没加入GROUP BY,也没被聚合函数处理,因此触发错误。

修正后的存储过程

核心思路是先计算每条度假记录在目标月份的有效住宿天数,再算出该记录的对应费用,最后按城市分组求平均:

ALTER PROCEDURE sp_AdminAvgPriceMonth
    @month int
AS
BEGIN
    SELECT 
        FT.City,
        AVG(
            -- 计算单条记录在目标月的有效天数 × 房价
            (
                CASE
                    -- 入住、退房都在目标月
                    WHEN MONTH(VT.StartDate) = @month AND MONTH(VT.EndDate) = @month
                        THEN DATEDIFF(day, VT.StartDate, VT.EndDate)
                    -- 入住在目标月,退房在其他月:计算到目标月月底的天数
                    WHEN MONTH(VT.StartDate) = @month AND MONTH(VT.EndDate) <> @month
                        THEN DATEDIFF(day, VT.StartDate, EOMONTH(VT.StartDate))
                    -- 入住在其他月,退房在目标月:从目标月1号计算到退房日的天数
                    WHEN MONTH(VT.StartDate) <> @month AND MONTH(VT.EndDate) = @month
                        THEN DATEDIFF(day, DATEADD(month, DATEDIFF(month, 0, VT.EndDate), 0), VT.EndDate)
                    -- 无有效天数的情况(按需调整)
                    ELSE 0
                END
            ) * FT.price
        ) AS AvgPricePerNight
    FROM VacationsTable VT
    INNER JOIN FlatsTable FT ON VT.FlatId = FT.FlatId
    -- 过滤出和目标月相关的记录,提升性能
    WHERE MONTH(VT.StartDate) = @month OR MONTH(VT.EndDate) = @month
    GROUP BY FT.City
END

关键调整说明

  • 将avg()移到最外层,先计算单条记录的有效费用,再对分组结果求平均,避免CASE嵌套聚合函数导致的列引用问题
  • 明确指定FT.City分组,消除列歧义
  • 添加WHERE子句过滤目标月相关记录,减少不必要的计算
  • 补全了「入住不在目标月、退房在目标月」的逻辑,匹配需求描述

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 00:25:18