首页 > 解决方案 > 分组数据 SQL 的运行总计

问题描述

我知道有很多关于这个的问题,我已经尝试了很多答案,但没有一个对我有用(见下文最有希望的)。

我想获得按项目和日期分组的列金额中的运行总计,分为两组(发票或成本)。正如您在查询中看到的那样,该组依赖于成本中心。

这个主题似乎最接近我想要实现的目标,但我无法让它发挥作用。

SQL - 数据已经分组时的运行总计

使用下面的代码,我收到错误消息“列 'M3FDBPRD.MVXJDTA.FGLEDG.EGAIT2' 在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中。” 但我不想在结果中按成本中心分组,我只想用它来分组金额。

我试图达到的结果是这样的(如果使用上面的数据):

在此处输入图像描述

我目前的代码是这样的:

SELECT 
    Project As Projektnr,
    LastDayOfMonth,
    -SUM(CASE WHEN CostCenter= '9000' THEN Amount
            WHEN CostCenter = '2100' THEN Amount
            WHEN CostCenter = '2200' THEN Amount
            WHEN CostCenter = '2300' THEN Amount END) OVER (ORDER BY LastDayOfMonth) AS Invoiced,
    -SUM(CASE WHEN CostCenter > '9000' and CostCenter < '9999' THEN Amount END) OVER (ORDER BY LastDayOfMonth) AS RunningTotalCosts
  FROM [M3FDBPRD].[MVXJDTA].[FGLEDG]
  WHERE Project = '150001'
  GROUP BY LastDayOfMonth, Project
  ORDER BY LastDayOfMonth

我有 SQL Server 版本 13

谢谢

标签: sqlsql-server

解决方案


您正在混合窗口函数和聚合。逻辑如下:

SUM(SUM(CASE WHEN CostCenter IN ('9000' '2100', '2200', '2300')
             THEN Amount
        END)
   ) OVER (ORDER BY LastDayOfMonth) AS Invoiced,
SUM(SUM(CASE WHEN CostCenter > '9000' and CostCenter < '9999'
             THEN Amount
        END)
   ) OVER (ORDER BY LastDayOfMonth) AS RunningTotalCosts

也就是SUM()s需要嵌套。内部SUM()是聚合。外部SUM()是窗口函数。


推荐阅读