如何为上一年的搜索总销售额创建查询
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 Server 2008 R2-查询以获取按月销售的总销售额和数量