Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 获取过去2年在特定日期的成本滚动总和_Sql_Sql Server - Fatal编程技术网

Sql 获取过去2年在特定日期的成本滚动总和

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

我有一个查询,其中我必须查询特定月份过去2年实际利润/收入的滚动总和

比如说,发票的月份和年份是2019年7月。我需要获得2017年7月至2019年的
总和(实际值)

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”中,我总是忘记,当您在分组聚合上调用窗口聚合时,您要求和。我已经搞定了。