查询谁支付了超过 10k

Ant*_*nio 2 sql-server select sql-server-2012

我有一张包含付款信息的表格,如下所示:

ID COSTUMER_ID DATEPAID     AMOUNT
1    1        2012-01-01      50
2    1        2012-02-01      100
3    1        2012-03-01      70
4    2        2012-03-01     6000
4    2        2012-09-01     3000
4    2        2014-04-01     8000
5    3        2013-03-01     9000
6    3        2013-08-01     3000
Run Code Online (Sandbox Code Playgroud)

等等。我需要知道哪些客户在 12 个月内支付了超过 10,000 美元。(在示例中,只有客户 3 适合)。不要介意什么时候,唯一的标准是在任何连续 12 个月的组合中 SUM(AMOUNT) > 10000。

但我坚持下去。有任何想法吗?我正在使用 SQL Server 2012。

Jam*_*s Z 5

一种方法是选择返回表并对行之前的行求和,然后将其用作内部查询,以便能够在 where 子句中使用总和,如下所示:

select *
from (
  select
    P1.ID,
    P1.CUSTOMER_ID,
    P1.DATEPAID,
    (select sum(P2.AMOUNT) 
      from PAYMENT P2 
      where P1.CUSTOMER_ID = P2.CUSTOMER_ID and 
      P2.DATEPAID <= P1.DATEPAID and 
      P2.DATEPAID >= dateadd(month, -12, P1.DATEPAID)) as PAID12M
  from
    PAYMENT P1
) X
where PAID12M > 10000
Run Code Online (Sandbox Code Playgroud)

SQL Fiddle 中的示例。

这将返回条件匹配的所有行,如果您只需要 customer_id 或第一行或类似的东西,则必须使外部查询更复杂一些。

  • 如果你有很多数据,你可能想要添加一个适当的索引(例如,在那个小提琴中像“ALTER TABLE payment ADD UNIQUE CLUSTERED ([CUSTOMER_ID], [DATEPAID])”这样的东西),以便相关的子查询能够使用搜索而不是扫描完整的数据集。 (3认同)