在 SQL 中获取用户的最后一笔付款
Posted
技术标签:
【中文标题】在 SQL 中获取用户的最后一笔付款【英文标题】:Get Last Payment From A User in SQL 【发布时间】:2018-05-15 16:11:35 【问题描述】:我有这张桌子
我试图从最后一个交易日期获得本金 + 利息的总和。 第 4 列。是最后一次执行的交易 - [No column name] 是交易日期
到目前为止我所尝试的:
select sum(h.principal+h.interest) as amt_paid, MAX(h.trx_date)
from Loanhist h WHERE h.ac_no = '$id' and h.trx_type='LP'
GROUP BY principal, interest
【问题讨论】:
你能详细说明你在寻找什么吗?因为在这里您正在使用聚合函数并将它们分组。因此,数据库不会返回最后一个事务。我们需要编写一个不同的查询。如果您只想获得最后一笔交易,那么我们可以进行查询。 @Rohit.007,我已经编辑了我的问题。谢谢。 【参考方案1】:测试数据生成是针对 Oracle 的,但您应该能够轻松适应它。实际查询将在 SQL Server 上运行。如果帐户可以在一天内发布多笔交易,您将需要使用这样的方法。否则,其他答案中的 'LIMIT/TOP 1' 方法将正常工作。
CREATE GLOBAL TEMPORARY TABLE balances
( ac_no CHAR(100),
principal FLOAT,
interest FLOAT,
tranDate DATE
)
ON COMMIT PRESERVE ROWS;
INSERT INTO balances VALUES (1,123.123,.456,DATE '2017-01-01');
INSERT INTO balances VALUES (1,100,.456,DATE '2017-01-02');
INSERT INTO balances VALUES (1,200,.1,DATE '2017-01-02');
INSERT INTO balances VALUES (2,200,.1,DATE '2017-01-02');
INSERT INTO balances VALUES (2,300,.1,DATE '2017-01-02');
SELECT SUM
( CASE WHEN tranDate = max_tran_date
THEN principal + interest
ELSE 0
END
) AS tranSum
FROM (SELECT sub.*,
MAX(tranDate) OVER() AS max_tran_date
FROM balances sub
) BAL;
【讨论】:
【参考方案2】:你的问题不是很清楚。但是,如果您只想获取用户执行的最后一笔交易,最好的办法是依赖 ID 而不是日期。
SELECT TOP 1 * FROM Loanhist h WHERE h.trx_type='LP' ORDER BY h.ac_no DESC
【讨论】:
我想你会想按 trx_date 而不是 ac_no 订购。 :)【参考方案3】:尝试使用 LIMIT 关键字。例如,Select * from table name where condition LIMIT 1.它将返回第一行
【讨论】:
【参考方案4】:试试这个:
SELECT TOP 1 sum(h.principal+h.interest) as amt_paid, h.trx_date
FROM Loanhist h WHERE h.ac_no = '$id' AND h.trx_type='LP'
ORDER BY h.ac_no DESC;
【讨论】:
这不是假设 ac_no 一天不能有超过一笔交易吗? 如果一天有多个交易,则选择最新的。 听起来他们想要最后的交易日期,否则不需要汇总。 根据她的描述,她正在尝试获取上次交易日期的本金+利息的总和。 是的,最后交易日期。这并不排除下午 2 点和 3 点的交易,这两个时间都在最后一天。以上是关于在 SQL 中获取用户的最后一笔付款的主要内容,如果未能解决你的问题,请参考以下文章
一笔订单,但是误付了两笔钱!这种重复付款异常到底该如何解决?