Sql如何计算累计值的同比?

如某种商品的月销量。
利用窗口函数可以实现月度的同比、环比计算。但计算累计月份的同比,如今年上半年对去年上半年的同比,则会报错,疑似是因为窗口函数不能在计算月度累计值和累计值同比中出现两次。
请问这个问题普遍吗?各位如何计算的?

如果要计算 SQL 中的累计值的同比,您可以使用窗口函数。窗口函数可以在计算聚合函数时计算前 N 行的值。

SELECT
  month,
  sales,
  SUM(sales) OVER (ORDER BY month) / SUM(sales) OVER (ORDER BY month ROWS BETWEEN 11 PRECEDING AND 1 PRECEDING) - 1 AS YoY_cumulative_sales
FROM sales;

例如,假设您有一个表 "sales" 包含月份和销售额,您可以使用以下语句计算同比累计销售额:
在上面的语句中,我们通过窗口函数使用 ROWS BETWEEN 11 PRECEDING AND 1 PRECEDING 子句计算前 11 个月的累计销售额,并将当前月份的累计销售额与前 11 个月的累计销售额相除,最后减 1 即可得到同比累计销售额。

该回答引用ChatGPT
请参考下面的解决方案,如果可行还请点击 采纳,感谢 !

下面是一个 计算今年上半年对去年上半年的月销量同比,可以使用以下SQL语句:

WITH CTE_Sale AS (
    SELECT 
        Date, 
        SUM(Quantity) OVER (PARTITION BY YEAR(Date), QUARTER(Date)) AS Quarter_Sale 
    FROM 
        Sales_Table
), CTE_LastYear AS (
    SELECT 
        Date, 
        SUM(Quantity) OVER (PARTITION BY YEAR(Date), QUARTER(Date)) AS Quarter_Sale 
    FROM 
        Sales_Table 
    WHERE 
        YEAR(Date) = YEAR(GETDATE()) - 1
)
SELECT 
    CTE_Sale.Quarter_Sale / CTE_LastYear.Quarter_Sale - 1 AS Quarter_Sale_YoY 
FROM 
    CTE_Sale 
JOIN 
    CTE_LastYear ON CTE_Sale.Date = CTE_LastYear.Date 
WHERE 
    CTE_Sale.Date BETWEEN '2021-01-01' AND '2021-06-30'