多行条件 SQL 查询

Posted

技术标签:

【中文标题】多行条件 SQL 查询【英文标题】:Conditional SQL Query on Multiple Rows 【发布时间】:2016-01-16 18:08:57 【问题描述】:

我试图找出哪些客户拖欠了他们的贷款。我想查询数据集以查找过去 60 天内未付款但不确定如何在 SQL 中实现此功能的客户的 User_id

User_id    Due_Date                Loan_Amount    Paid_Amount
1          2012-04-04 16:14:12    500            40
1          2012-05-04 16:14:12    500            40
1          2012-06-04 16:14:12    500            0
1          2012-07-04 16:14:12    500            0
1          2012-08-04 16:14:12    500            0
2          2012-02-15 03:30:55    2030           100
2          2012-03-15 03:30:55    2030           100
2          2012-04-15 03:30:55    2030           100
3          2012-01-03 12:24:42    777            10
3          2012-02-03 12:24:42    777            0
3          2012-03-03 12:24:42    777            0
3          2012-04-03 12:24:42    777            0

在伪代码中(以粗体显示)看起来像这样,但我似乎无法在 mysql 中实现它:

SELECT User_id from TABLE_NAME WHERE Loan_Amount > 0 AND [Paid_Amount 值已为空超过 60 天]

期望的输出: 上述查询中的用户 1 和 3 会因为连续 3 期未付款而被返回。

注意:Due_Date 是一个时间戳

任何想法都将不胜感激!

【问题讨论】:

我删除了无关的数据库标签。请随意为您真正使用的数据库添加标签。 您能否显示您希望查询获取的数据中的哪些记录? 是否可以使用时间戳作为 Due_Date 而不是日期字符串? 你有贷款明细表吗?您如何知道付款的到期时间? @Peter M 我已经更新了帖子,提供了更多详细信息。 Due_Date 值是时间戳 【参考方案1】:

看起来您可以使用DATEDIFF(date1, date1) 函数来获取拖欠借款人的列表。

SELECT DISTINCT
     user_id
FROM table_name n
     JOIN (SELECT user_id, max(due_date) maxDate FROM table_name GROUP BY user_id) t 
          ON n.user_id = t.user_id 
         AND n.due_date = t.maxDate
WHERE 
     loan_amount > 0
     AND paid_amount IS NULL
     AMD DATEDIFF(due_date, getdate()) > 60  

【讨论】:

【参考方案2】:

我之前的查询错了,试试这个

select distinct t1.User_id
from TABLE_NAME t1
    inner join (
        select ts1.User_id, sum(ts1.Paid_Amount) as Paid_Amount_Total
        from TABLE_NAME ts1
        group by ts1.User_id
    ) t2
        on t1.User_id=t2.User_id and t1.Loan_Amount>t2.Paid_Amount_Total
)
where
    t1.Loan_Amount > 0
    and t1.User_id not in (
        select ts2.User_id
        from TABLE_NAME ts2
        where ts2.Due_Date>=DATE_SUB(NOW(), INTERVAL 60 DAY) and ts2.Paid_Amount>0
    )

t1、ts1、ts2 - 是 TABLE_NAME 的别名

【讨论】:

谢谢你,但这里的 t1 和 t2 指的是什么?

以上是关于多行条件 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

Oracle-查询,,..

MYSQL子查询

MySql 01(安装,删除,简介,常用命令,简单查询,条件查询,排序,单行处理函数多行处理函数分组查询)

SQL server如何查询满足条件的前3数据

sql实现多字段求和并查询

SQL 查询有条件地连接来自不同数据库的列