繁体   English   中英

SQL计数记录取决于条件

[英]SQL count records depending on criteria

我有一张桌子,上面有每个工作日的帐户信息。 每条记录都会显示该天特定日期的帐户余额。 我需要创建一个字段,该字段自该特定帐户的余额为零以来已经运行了多少天。

例如:我有一个号码为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

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

谢谢,本

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

在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非常相似的操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM