【问题标题】:How to create query for search total sales previous year如何为上一年的搜索总销售额创建查询
【发布时间】:2021-03-03 18:02:00
【问题描述】:

我有一个名为 Sales.OrderValues 的表,其中包含 2 列,即 orderyear 和 val(每天的总销售额)。

这是记录 sn-p(我无法显示所有记录,因为有 830 行)

我想显示这样的结果

但是,我的输出与我的预期输出不同。

如您所见,2008 年 prevtotalsales 的预期产量为 618085.30。但是,我的输出是 825169.29(即 208083.99 + 617085.30)。

以下是我的查询

SELECT
   YEAR(D1.orderdate) AS orderyear,
   SUM(D1.val) AS curtotalsales,
   (
      SELECT
         SUM(D2.val) 
      FROM
         Sales.OrderValues D2 
      WHERE
         YEAR(D1.orderdate) > YEAR(D2.orderdate)
   )
   AS prevtotalsales 
FROM
   Sales.OrderValues D1 
GROUP BY
   YEAR(D1.orderdate);

不加下一年的totalsales如何显示上一年totalsales的SUM?

【问题讨论】:

  • 缺一年怎么办?

标签: sql sql-server sum subquery aggregate-functions


【解决方案1】:

基本上,您希望在子查询的WHERE 子句中有一个相等条件。这个:

WHERE YEAR(D1.orderdate) > YEAR(D2.orderdate)

应该是:

WHERE YEAR(D1.orderdate) = YEAR(D2.orderdate) + 1

但是只使用lag()会更简单、更高效:

SELECT
    YEAR(orderdate) AS orderyear,
    SUM(val) AS curtotalsales,
    LAG(SUM(val)) OVER(ORDER BY YEAR(orderdate))  AS prevtotalsales 
FROM Sales.OrderValues 
GROUP BY YEAR(orderdate)
ORDER BY orderyear

【讨论】:

    【解决方案2】:

    您需要先SUM每年的值,然后使用累积的SUM

    WITH Totals AS(
        SELECT YEAR(OV.orderdate) AS OrderYear
               SUM(OV.Val) AS YearSum
        FROM Sales.OrderValues OV
        GROUP BY YEAR(OV.orderdate))
    SELECT OrderYear,
           YearSum,
           SUM(YearSum) OVER (ORDER BY OrderYear ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS PreviousCumulative
    FROM Totals;
    

    【讨论】:

      猜你喜欢
      • 2022-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-16
      • 1970-01-01
      • 2021-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多