Sql 获取过去2年在特定日期的成本滚动总和
我有一个查询,其中我必须查询特定月份过去2年实际利润/收入的滚动总和 比如说,发票的月份和年份是2019年7月。我需要获得2017年7月至2019年的Sql 获取过去2年在特定日期的成本滚动总和,sql,sql-server,Sql,Sql Server,我有一个查询,其中我必须查询特定月份过去2年实际利润/收入的滚动总和 比如说,发票的月份和年份是2019年7月。我需要获得2017年7月至2019年的总和(实际值) OVER()函数在这里工作吗 这是我以前的问题: SELECT Agent AS IBO, CustomerMode AS Mode, MONTH(OriginalInvoiceExtractDate) AS monthInvoice, YEAR(OriginalInvoiceExtractDate) AS yearIn
总和(实际值)
OVER()
函数在这里工作吗
这是我以前的问题:
SELECT Agent AS IBO,
CustomerMode AS Mode,
MONTH(OriginalInvoiceExtractDate) AS monthInvoice,
YEAR(OriginalInvoiceExtractDate) AS yearInvoice,
SUM(ActualMargin) AS ActualMargin,
SUM(TotalActualRevenue) AS TotalActualRevenue,
(SUM(ActualMargin) / NULLIF(SUM(TotalActualRevenue), 0)) * 100 AS MarginPct
FROM table
GROUP BY Agent, CustomerMode, MONTH(OriginalInvoiceExtractDate), YEAR(OriginalInvoiceExtractDate)
ORDER BY Agent, CustomerMode
最终输出将是代理模式组合,我应该得到SUM(实际保证金)
,其中将实际保证金汇总到本月最后24个月
只要您使用的是合适的SQL Server版本,就可以使用Over 以下是您的查询版本,其中添加了一列(ActualMargin2Years),表示过去两年的实际利润总额。请注意,我将回顾23个月,这是一个包括当前月份在内的24个月窗口。如果如您所述,您希望从2017年7月到2019年7月,这实际上是25个月,因为这段时间将包括2017年7月、2018年和2019年7月
SELECT Agent AS IBO,
CustomerMode AS Mode,
MONTH(OriginalInvoiceExtractDate) AS monthInvoice,
YEAR(OriginalInvoiceExtractDate) AS yearInvoice,
SUM(ActualMargin) AS ActualMargin,
SUM(SUM(ActualMargin)) OVER (PARTITION BY Agent,CustomerMode ORDER BY YEAR(OriginalInvoiceExtractDate),MONTH(OriginalInvoiceExtractDate) rows between 23 preceding an current row) AS ActualMargin2Years,
SUM(TotalActualRevenue) AS TotalActualRevenue,
(SUM(ActualMargin) / NULLIF(SUM(TotalActualRevenue), 0)) * 100 AS MarginPct
FROM table
GROUP BY Agent, CustomerMode, MONTH(OriginalInvoiceExtractDate), YEAR(OriginalInvoiceExtractDate)
ORDER BY Agent, CustomerMode
如果您需要一个不同的窗口来聚合,以下可能是合适的替代方案。
包括当前月份在内的25个月窗口:
rows between current row and 24 preceding
rows between 1 preceeding and 23 preceding
24个月窗口(不包括当月):
rows between current row and 24 preceding
rows between 1 preceeding and 23 preceding
据我所知,您希望使用组合键
Agent
和CustomerMode
获得累计保证金,在这种情况下,您可以尝试以下操作:
select t.IBO,
t.Mode,
yearInvoice,
monthInvoice,
SUM (ActualMargin) over (partition by t.IBO, t.Mode order by yearInvoice, monthInvoice) as CumulativeMargin
from (
SELECT Agent AS IBO,
CustomerMode AS Mode,
MONTH(OriginalInvoiceExtractDate) AS monthInvoice,
YEAR(OriginalInvoiceExtractDate) AS yearInvoice,
SUM(ActualMargin) AS ActualMargin,
SUM(TotalActualRevenue) AS TotalActualRevenue,
(SUM(ActualMargin) / NULLIF(SUM(TotalActualRevenue), 0)) * 100 AS MarginPct
FROM table
GROUP BY Agent, CustomerMode, MONTH(OriginalInvoiceExtractDate), YEAR(OriginalInvoiceExtractDate)
) as t
go
您的DBMS是MySQL还是SQL Server?@AlessioCantarella SQL Server。我正在使用MSFT SQL Server管理研究为什么要使用MySQL标记,或者在问题中谈论MySQL?这根本没有帮助,因为MySQL首先在MySQL 8.0中添加了窗口支持。@PanagiotisKanavos删除了添加一些示例输入和预期输出。.运行此代码时出现此错误“ActualMargin”在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句“Ooops”中,我总是忘记,当您在分组聚合上调用窗口聚合时,您要求和。我已经搞定了。