如何为上一年的搜索总销售额创建查询

Posted

技术标签:

【中文标题】如何为上一年的搜索总销售额创建查询【英文标题】: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?

【问题讨论】:

缺一年怎么办? 【参考方案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;

【讨论】:

以上是关于如何为上一年的搜索总销售额创建查询的主要内容,如果未能解决你的问题,请参考以下文章

如何获得两个查询结果集之间的差异

SQL查询问题

SQL Server 2008 R2-查询以获取按月销售的总销售额和数量

如何为在 Shopify 中销售订阅产品设置定期付款

如何为一个非常大的 Core Data 数据库创建一个快速搜索机制?

如何用数据库mysql查询产品的产品编号和销售数量的总和