在 SQL 中运行总和

问题描述

我有以下查询

SELECT COUNT(disTINCT (fgt_curate.orders.ordernumber)) AS cnt,fgt_curate.d_datetable.Weeknum
      FROM fgt_curate.orders
        LEFT JOIN fgt_curate.d_datetable ON fgt_curate.d_datetable.Date_Key = fgt_curate.orders.Orderdatekey
      WHERE YEAR> 2020
      AND   cancelled = FALSE
      AND   fgt_curate.d_datetable.Weeknum <= 11
      GROUP BY fgt_curate.d_datetable.Weeknum

输出类似于下面的表格:

cnt weeknum
15 1
18 2
23 3
12 4

要做的就是添加一个新列来计算累积总和。

谢谢你们。

解决方法

这将是:

SELECT d.Weeknum,COUNT(DISTINCT o.ordernumber) AS cnt,SUM(COUNT(DISTINCT o.ordernumber)) OVER (ORDER BY d.Weeknum) as running_cnt
FROM fgt_curate.orders o LEFT JOIN 
     fgt_curate.d_datetable d
     ON d.Date_Key = o.Orderdatekey
WHERE d.YEAR > 2020 AND
      o.cancelled = FALSE AND
      d.Weeknum <= 11
GROUP BY d.Weeknum;

注意事项:

  • 使用表别名使查询更易于编写和阅读。
  • 限定所有列引用,以便来源清晰。我不得不猜测您查询中的大多数列。
  • WHERE 子句将 LEFT JOIN 转换为内部联接。你应该改变它(但我上面没有这样做)。
  • DISTINCT 不是 COUNT(DISTINCT) 中的函数。 o.ordernumber 周围的括号是多余的。
  • 我认为 ordernumber 在名为 orders 的表中是唯一的。如果是这样,只需使用 COUNT(*)

编辑:

我推测您希望获得指定时间段内的所有周。如果是这样,结构将是:

SELECT d.Weeknum,SUM(COUNT(DISTINCT o.ordernumber)) OVER (ORDER BY d.Weeknum) as running_cnt
FROM fgt_curate.d_datetable d LEFT JOIN
     fgt_curate.orders o 
     ON o.Orderdatekey = d.Date_Key AND
        o.cancelled = FALSE 
WHERE d.YEAR > 2020 AND
      d.Weeknum <= 11
GROUP BY d.Weeknum;

要保留所有行(日期)的表排在第一位。对该表的任何过滤都在 WHERE 子句中。对后续表的任何过滤都在 ON 子句中。