SQL存储桶确定年龄分组
我有一个包含遗留数据的数据库,存储交易,并使用“bucket”方法确定账户余额。我需要一种方法来让我的账户过期 表事务处理SQL存储桶确定年龄分组,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个包含遗留数据的数据库,存储交易,并使用“bucket”方法确定账户余额。我需要一种方法来让我的账户过期 表事务处理 事务ID 交易类型(费用、收据) 金额 过期 要获取当前余额,请执行以下操作: SELECT SUM(CASE TransactionTypeId WHEN RECEIPT THEN Amount * -1 ELSE Amount END) CurrentBalance 选择SUM(接收时案例交易类型ID,然后选择Amount*-1,否则为Amount END)Curren
事务ID
交易类型(费用、收据)
金额
过期 要获取当前余额,请执行以下操作: SELECT SUM(CASE TransactionTypeId WHEN RECEIPT THEN Amount * -1 ELSE Amount END) CurrentBalance 选择SUM(接收时案例交易类型ID,然后选择Amount*-1,否则为Amount END)CurrentBalance 我需要一种方法来确定过期30、60、90、120等: 账户活期30 60 90 120+
12345$50.00$0.00$25.00$25.00$0.00 我尝试运行单独的查询,并将收费后发日期限制在30,60,90120以上,为每个组运行并减去其他组,等等,但无法得到预期的结果 该表不存储过期标志,所有余额都是动态计算的 我错过了一些简单的东西吗?我尝试了网络搜索,但不确定是否有用于这种sql查询的术语 如果有帮助的话,数据库就是SQL Server
TIA您可以在
案例中使用附加条款来过滤过去30天的交易。例如:
SELECT
SUM(
CASE WHEN TransactionTypeId = 'RECEIPT' THEN -Amount
ELSE Amount
END) as CurrentDue
, SUM(CASE WHEN datediff(d,PostDate,getdate()) <= 30 THEN 0
WHEN TransactionTypeId = 'RECEIPT' THEN -Amount
ELSE Amount
END) as PastDue30
, ...
FROM Transactions
这就是我最终得到的,我以前得到的东西,但没有检查到期金额为零的时间,也没有检查前一组是否有负值。我不得不加上它们,因为我得到了奇怪的结果,比如说,如果该账户的服务费用过高,那么之前的一段时间的到期日将为负数
SELECT
ServiceId,
AmountDue PastDue,
CASE AmountDue WHEN 0 THEN 0 ELSE CASE WHEN AmountDue60 < 0 THEN 0 ELSE AmountDue30 - AmountDue60 END END PastDue30,
CASE AmountDue WHEN 0 THEN 0 ELSE CASE WHEN AmountDue90 < 0 THEN 0 ELSE AmountDue60 - AmountDue90 END END PastDue60,
CASE AmountDue WHEN 0 THEN 0 ELSE CASE WHEN AmountDue120 < 0 THEN 0 ELSE AmountDue90 - AmountDue120 END END PastDue90,
CASE AmountDue WHEN 0 THEN 0 ELSE CASE WHEN AmountDue120 < 0 THEN 0 ELSE AmountDue120 END END PastDue120
FROM
(
SELECT T.ServiceId,
SUM(CASE WHEN T.TransactionTypeId = @Receipt THEN T.TAmount * -1 WHEN T.TransactionTypeId = @Charge THEN T.TAmount ELSE 0 END) AmountDue,
SUM(CASE WHEN T.TransactionTypeId = @Receipt THEN T.TAmount * -1 WHEN T.TransactionTypeId = @Charge THEN CASE WHEN DATEDIFF(D, T.TPostDate, @TPostDate) >= 30 THEN T.TAmount ELSE 0 END ELSE 0 END) AmountDue30,
SUM(CASE WHEN T.TransactionTypeId = @Receipt THEN T.TAmount * -1 WHEN T.TransactionTypeId = @Charge THEN CASE WHEN DATEDIFF(D, T.TPostDate, @TPostDate) >= 60 THEN T.TAmount ELSE 0 END ELSE 0 END) AmountDue60,
SUM(CASE WHEN T.TransactionTypeId = @Receipt THEN T.TAmount * -1 WHEN T.TransactionTypeId = @Charge THEN CASE WHEN DATEDIFF(D, T.TPostDate, @TPostDate) >= 90 THEN T.TAmount ELSE 0 END ELSE 0 END) AmountDue90,
SUM(CASE WHEN T.TransactionTypeId = @Receipt THEN T.TAmount * -1 WHEN T.TransactionTypeId = @Charge THEN CASE WHEN DATEDIFF(D, T.TPostDate, @TPostDate) >= 120 THEN T.TAmount ELSE 0 END ELSE 0 END) AmountDue120
FROM Transactions T
WHERE T.AccountId = @AccountId
GROUP BY T.ServiceId
) AB
@Andomar-最近(即过去30天内)收到的收据应从过去30天的金额中减去-可能不包括过去30天内的费用马丁·克莱顿:那么“过期”真的是从30天起尚未支付的费用吗?在SQL中,可以通过交换when
子句来计算。我会把它添加到答案中,我想是的,很好的解决方案,+1。
SELECT
ServiceId,
AmountDue PastDue,
CASE AmountDue WHEN 0 THEN 0 ELSE CASE WHEN AmountDue60 < 0 THEN 0 ELSE AmountDue30 - AmountDue60 END END PastDue30,
CASE AmountDue WHEN 0 THEN 0 ELSE CASE WHEN AmountDue90 < 0 THEN 0 ELSE AmountDue60 - AmountDue90 END END PastDue60,
CASE AmountDue WHEN 0 THEN 0 ELSE CASE WHEN AmountDue120 < 0 THEN 0 ELSE AmountDue90 - AmountDue120 END END PastDue90,
CASE AmountDue WHEN 0 THEN 0 ELSE CASE WHEN AmountDue120 < 0 THEN 0 ELSE AmountDue120 END END PastDue120
FROM
(
SELECT T.ServiceId,
SUM(CASE WHEN T.TransactionTypeId = @Receipt THEN T.TAmount * -1 WHEN T.TransactionTypeId = @Charge THEN T.TAmount ELSE 0 END) AmountDue,
SUM(CASE WHEN T.TransactionTypeId = @Receipt THEN T.TAmount * -1 WHEN T.TransactionTypeId = @Charge THEN CASE WHEN DATEDIFF(D, T.TPostDate, @TPostDate) >= 30 THEN T.TAmount ELSE 0 END ELSE 0 END) AmountDue30,
SUM(CASE WHEN T.TransactionTypeId = @Receipt THEN T.TAmount * -1 WHEN T.TransactionTypeId = @Charge THEN CASE WHEN DATEDIFF(D, T.TPostDate, @TPostDate) >= 60 THEN T.TAmount ELSE 0 END ELSE 0 END) AmountDue60,
SUM(CASE WHEN T.TransactionTypeId = @Receipt THEN T.TAmount * -1 WHEN T.TransactionTypeId = @Charge THEN CASE WHEN DATEDIFF(D, T.TPostDate, @TPostDate) >= 90 THEN T.TAmount ELSE 0 END ELSE 0 END) AmountDue90,
SUM(CASE WHEN T.TransactionTypeId = @Receipt THEN T.TAmount * -1 WHEN T.TransactionTypeId = @Charge THEN CASE WHEN DATEDIFF(D, T.TPostDate, @TPostDate) >= 120 THEN T.TAmount ELSE 0 END ELSE 0 END) AmountDue120
FROM Transactions T
WHERE T.AccountId = @AccountId
GROUP BY T.ServiceId
) AB