我试图在SQL Server上写一个帐龄报告,该报告显示过期发票的总金额(稍后我将不得不扣除贷方票据),根据过期天数的不同,这些发票将落入不同的列中。即(〉0)、(0-30)、(31-60)、(61-90)等。
这是我写的查询的一部分,到目前为止,主要是在这个论坛上看旧的帖子,但它给了我很多重复,即使是对于没有到期余额的帐户。
知道我做错了什么吗?
SELECT O.cardcode AS [Account],
O.cardname AS [Name],
O.u_creditlimit AS [Credit Limit],
O.u_onhold AS [On Hold],
O.balance,
Isnull(CASE
WHEN Datediff(day, INV.docduedate, Getdate()) >= 0 AND Datediff(day, INV.docduedate, Getdate()) < 30
THEN (
SELECT Sum(doctotal)
FROM oinv
WHERE cardcode = INV.cardcode)
END, 0) AS [0 to 30 Days],
Isnull(CASE
WHEN Datediff(day, INV.docduedate, Getdate()) >= 31 AND Datediff(day, INV.docduedate, Getdate()) < 60
THEN (
SELECT Sum(doctotal)
FROM oinv
WHERE cardcode = INV.cardcode)
END, 0) AS [31 to 60 Days],
Isnull(CASE
WHEN Datediff(day, INV.docduedate, Getdate()) >= 61 AND Datediff(day, INV.docduedate, Getdate()) < 90
THEN (
SELECT Sum(doctotal)
FROM oinv
WHERE cardcode = INV.cardcode)
END, 0) AS [61 to 90 Days],
Isnull(CASE
WHEN Datediff(day, INV.docduedate, Getdate()) >= 91 AND Datediff(day, INV.docduedate, Getdate()) < 120
THEN (
SELECT Sum(doctotal)
FROM oinv
WHERE cardcode = INV.cardcode)
END, 0) AS [91 to 120 Days],
Isnull(CASE
WHEN Datediff(day, INV.docduedate, Getdate()) >= 121
THEN(
SELECT Sum(doctotal)
FROM oinv
WHERE cardcode = INV.cardcode)
END, 0) AS [121+ Days]
FROM ocrd O
INNER JOIN oinv INV
ON O.cardcode = INV.cardcode
WHERE territory = 3
AND INV.docstatus = 'O'
非常感谢您的光临。
2条答案
按热度按时间2mbi3lxu1#
你可以清理一下
首先,使用CROSS APPLY计算一次过期天数,然后对最终结果进行条件聚合
示例(未测试)
编辑-贷方票据
在没有示例数据或结构的情况下,这里是我的猜测
cnwbcb6i2#
当提出问题时,提供演示数据是一个很好的主意,而将其作为一个对象提供则是一个更好的主意,我们可以轻松地重新创建:
这将允许某人只运行TSQL来创建和填充对象。
现在使用这个对象我们可以写
这个伪代码,可能需要一些调整,以得到正是你要找的.
简单介绍一下LAG和它的伙伴LEAD。你指定一列和行中的偏移量。LAG向后看,LEAD向前看。它们都像其他窗口函数一样使用over子句。