这是支票兑现业务。
我有一张支票兑现表:
CustomerID, CustomerName, DateTimeCashed, CheckAmount, CheckFee, CheckPaypot
00100 John Doe 01/01/2017 12:40:30 1000 20 980
00200 John Smith 01/02/2017 13:24:45 2000 40 1960
..................
有数以千计的记录。
我需要构建一个查询,该查询将返回所有记录,其中每个客户在任何24小时内兑现的总CheckPaypot超过10000.
如果将24小时间隔定义为从凌晨12:00到晚上11:59的一天,我知道如何执行此操作。
Select * from (
Select CustomerID, CustomerName, DateTimeCashed, CheckAmount, CheckFee, CheckPaypot,
(Select sum(ch.CheckPaypot) from Checks ch
where
ch.CustomerID = c.CustomerID and CONVERT(date, cn.DateTimeCashed) = CONVERT(date, c.DateTimeCashed)
) as Total from Checks c) x
where x.Total > 10000
但要求是时间间隔是浮动的意味着开始和结束可以是任何东西 只要时间间隔的长度是24小时。因此,客户兑现了3张支票:下午1点检查 在第二天中午之前进行2次检查,这些检查总数超过10000美元,所有检查都必须包含在结果中。
谢谢你, lenkost。
答案 0 :(得分:1)
SELECT
CustomerID,
SUM(CheckPaypot)
FROM
tb_previsao
WHERE
DateTimeCashed > DateTimeCashed - INTERVAL '1' DAY
GROUP BY
CustomerID
HAVING
SUM(CheckPaypot) > 10000;
答案 1 :(得分:0)
不幸的是,您必须使用相关的子查询:
SELECT
FROM (
SELECT outer_ch.*,
(SELECT SUM(checkpayout)
FROM checks inner_ch
WHERE DATEDIFF(HOUR, inner_ch.datetimecashed, outer_ch.datetimecashed)
BETWEEN 0 AND 23
AND inner_ch.customerid = outer_ch.customerid) AS running_sum_checkpayout
FROM checks outer_ch
)
WHERE running_sum_checkpayout > 10000
我说“不幸”,因为相关子查询必然效率低,因为它们为结果集中的每一行执行单独的子查询。如果这不能很好地执行,请尽量避免对每个子查询执行全表扫描,例如在customerid
上添加索引。