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

求YTD与MTD销售总额的SQL查询报错问题求助

解决SQL计算YTD/MTD时的分组错误问题

你的报错核心问题是窗口函数里直接引用了未被聚合或分组的原始列。原查询中,你用GROUP BY按orderdate、月份、年份分组,但窗口函数里的(unit_price*order_quantity)-discount_applied用的是sales表的原始字段,这些字段既没被包含在GROUP BY里,也没被聚合函数包裹,SQL引擎无法确定如何在分组后的行里处理这些字段,所以抛出错误。

修正后的查询语句

可以先通过子查询或CTE完成每日销售总额的聚合,再基于聚合结果计算YTD和MTD:

方式1:使用CTE

WITH daily_sales AS (
    SELECT 
        orderdate,
        DATENAME(month, orderdate) AS Mnth,
        YEAR(orderdate) AS YR,
        SUM((unit_price * order_quantity) - discount_applied) AS Total_Sales
    FROM sales
    GROUP BY orderdate, DATENAME(month, orderdate), YEAR(orderdate)
)
SELECT 
    orderdate,
    Mnth,
    YR,
    Total_Sales,
    SUM(Total_Sales) OVER (PARTITION BY YR ORDER BY orderdate) AS YTD,
    SUM(Total_Sales) OVER (PARTITION BY YR, Mnth ORDER BY orderdate) AS MTD
FROM daily_sales

方式2:使用子查询

SELECT 
    orderdate,
    Mnth,
    YR,
    Total_Sales,
    SUM(Total_Sales) OVER (PARTITION BY YR ORDER BY orderdate) AS YTD,
    SUM(Total_Sales) OVER (PARTITION BY YR, Mnth ORDER BY orderdate) AS MTD
FROM (
    SELECT 
        orderdate,
        DATENAME(month, orderdate) AS Mnth,
        YEAR(orderdate) AS YR,
        SUM((unit_price * order_quantity) - discount_applied) AS Total_Sales
    FROM sales
    GROUP BY orderdate, DATENAME(month, orderdate), YEAR(orderdate)
) AS daily_sales

修正逻辑说明

先通过内层查询完成按日期的聚合,把原始的单价、订单数量、折扣字段计算成每日的Total_Sales。在外层查询中,基于已经聚合好的每日销售额,用窗口函数分别按年份、年份+月份分组排序,计算累计的YTD(年初至今)和MTD(月初至今)值,这样就避免了引用未聚合原始字段的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 22:50:30