首页 > 解决方案 > 在每行的两个日期之间计数

问题描述

我需要计算 [选定 YearMonth] 的每一行过去 12 个月的 [SALES]。例如,如果选择 202110,我知道在 202110 和 202011 之间我有一次销售,并且 202110 前面的 [HAD SALES] 应该显示 1,但是,如果选择 202008 并且我回顾过去 12 个月,则没有销售并且我的行应该显示 0。

我需要类似下面的语句,但我的语句中没有 where 子句或参数,但我不确定如何将它们放在一起。

SELECT 
    [SELECTED YEARMONTH], 
    (COUNT(SALES) FROM TABLE 
     WHERE [SELECTED YEARMONTH] BETWEEN [SELECTED PREVYEAR] AND [SELECTED YEARMONTH])
FROM 
    TABLE;

在此处输入图像描述

标签: sqldb2db2-400db2-luw

解决方案


试试下面的说法。

请注意,如果有机会,您应该在子句中使用RANGE而不是ROWS在子句中,如示例中所示,您的表中某个月份没有行。OVER中使用的表达式ORDER BY返回几个月的连续枚举,这对于我们的算法来说是必要的RANGE

如果几个月内没有间隔,那么您可以ORDER BY YEARMONTH ROWS BETWEEN 11 PRECEDING AND CURRENT ROW改用。

SELECT 
  YEARMONTH
, SUM (SALES) OVER 
(
ORDER BY YEARMONTH / 100 * 12 + MOD (YEARMONTH, 100) 
RANGE BETWEEN 11 PRECEDING AND CURRENT ROW 
) AS SALES
FROM 
(
VALUES
  (202110, 1)
--, (202109, 1)
, (202108, 1)
, (202107, 1)
, (202106, 1)
, (202105, 1)
, (202104, 1)
, (202103, 1)
, (202102, 1)
, (202101, 1)
, (202012, 1)
, (202011, 1)
, (202010, 1)
, (202009, 1)
, (202008, 1)
) T (YEARMONTH, SALES)
ORDER BY YEARMONTH DESC
年月 销售量
202110 11
202108 12
202107 12
202106 11
202105 10
202104 9
202103 8
202102 7
202101 6
202012 5
202011 4
202010 3
202009 2
202008 1

推荐阅读