SQL计数记录取决于条件

时间:2016-01-26 10:48:41

标签: sql sql-server database

我有一张表,其中包含每个工作日的帐户信息。每条记录显示该特定日期帐户的余额。我需要创建一个字段,该字段具有自该特定帐户余额为零以来已经过多少天的运行计数。

例如:我有一个号码为00000001的帐户。它在一周前开放。数据库为上周二,周三,周四,周五和周一创建了帐户记录。该帐户在周五之前没有余额,周一余额相同。我希望该字段显示为“2”。此外,如果今天余额降至“0”,我需要在下一条记录中重置计数,如果该帐户在第二天有余额,则需要重新开始。此表中有几个帐户,因此我需要单独为每个帐户工作。

以下是我所拥有的:

SELECT
pos.EffDate,
cus.CNA1,
pos.ACNO,
pos.CCY,
pos.LDBL,
pos.LDBLUSD,
MIN(pos3.effdate) AS 'First Post Date',
pos3.Balcount

FROM[dbo].[Account] AS pos
JOIN [dbo].[Customer] AS cus ON ((pos.CNUM=cus.CUST_NO) AND (cus.effdate=pos.effdate))
LEFT JOIN (SELECT pos2.effdate, pos2.ACNO, SUM(CASE pos2.LDBL WHEN 0 THEN 0 ELSE 1 END) AS 'Balcount' FROM [dbo].[Account] AS pos2 GROUP BY pos2.ACNO, pos2.Effdate HAVING pos2.effdate BETWEEN pos2.effdate AND MIN(pos2.effdate)) pos3 ON pos3.ACNO = pos.ACNO
WHERE pos.effdate >='1 Dec 2015' AND pos.Effdate <'30 Dec 2015'
AND pos.srcsys = 'MP_UK'
AND pos.LDBL <= 0
AND pos.CNUM <> '000020'
AND pos.intbear <> 'N'
AND pos.blockdeb IS null

GROUP BY pos.EffDate,cus.CNA1,pos.ACNO,pos.CCY,pos.LDBL,pos.LDBLUSD, pos3.Balcount
ORDER BY 1,2,3

如果您需要我澄清任何事情,请告诉我。非常感谢所有帮助。

谢谢, 本

1 个答案:

答案 0 :(得分:1)

基本上,您希望根据给定行之前帐户为零的时间对数据进行分组。然后,在每个组中,您要枚举记录。

在SQL Server 2012+中,您可以使用窗口函数执行这些操作。我不确定您的示例查询与问题有什么关系,但这是基本的想法:

select a.*, row_number() over (partition by cust_no, grp order by eff_date) as seqnum
from (select a.*,
             sum(case when balance = 0 then 1 else 0 end) over 
                 (partition by cust_no order by eff_date) as grp
      from Account a
     ) a;

在早期版本的SQL Server中,您可以使用apply执行非常类似的操作。