【问题标题】:MySQL - SQL select query with two tables using where, count and havingMySQL - 使用 where、count 和 have 两个表的 SQL 选择查询
【发布时间】:2018-10-30 10:46:28
【问题描述】:

有两个表:clientcontract

客户表:

client_code INT pk
status      VARCHAR

一个客户可以有 1 个或多个合同。客户端有一个状态列,它指定它是否有有效的合同 - 值是“活动”或“非活动”。合同是为具有活动状态的客户指定的。

合约表:

contract_code INT pk
client_code   INT pk
end_date      DATE

合同有结束日期。今天之前的合同结束日期是过期的合同。

要求:报告要求所有活跃客户都有合同,但所有(不是部分)合同都已过期。一些示例数据如下所示:

客户数据:

client_code status
----------------------------------
1           active
2           inactive
3           active
4           active

合约数据:

contract_code   client_code   end_date
-------------------------------------------------------------
11              1             08-12-2018    
12              1             09-12-2018
13              1             10-12-2018
31              3             11-31-2018
32              3             10-30-2018
41              4             01-31-2019
42              4             12-31-2018

预期结果:

client_code
-------------
1

结果:此客户端 (client_code = 1) 的所有合约都已过期:08-12-201809-12-201810-12-2018

我需要一些帮助来编写 SQL 查询以获得此结果。我不确定我必须使用什么构造 - 可以指出我可以尝试什么。数据库是 MySQL 5.5。

【问题讨论】:

    标签: mysql sql select


    【解决方案1】:

    一种方法使用聚合。我们可以将clientcontract 表连接在一起,然后按客户汇总,检查对于活跃客户,不存在未来的合同结束日期。

    SELECT
        c.client_code
    FROM client c
    INNER JOIN contract co
        ON c.client_code = co.client_code
    WHERE
        c.status = 'active'
    GROUP BY
        c.client_code
    HAVING
        SUM(CASE WHEN co.end_date > CURDATE() THEN 1 ELSE 0 END) = 0;
    

    Demo

    注意:我假设您的日期以M-D-Y 格式出现只是由于特定的格式,而end_date 实际上是一个正确的日期列。如果您将日期存储为文本,那么我们可能需要先调用 STR_TO_DATE 将它们转换为日期。

    【讨论】:

    • 感谢您的回复。我会试试这个并回帖。
    • 我需要在这些行中编写一些查询 - 我无法在线寻找答案。我对数据库并不陌生,只是习惯于编写简单的查询。是否有我可以参考的资源 - 书籍或在线资源,特别是 MySQL。
    • SQL 与任何语言或大多数人类活动一样,需要练习才能掌握。老实说,参加 Stack Overflow 是学习 SQL 的好方法。
    【解决方案2】:

    这就是你要找的吗?

    select clients.client_code
    from clients
    join contracts
    on contracts.client_code=clients.client_code
    where status='active'
    group by clients.client_code
    having min(end_date)>curdate() 
    

    【讨论】:

      猜你喜欢
      • 2011-06-23
      • 2012-04-13
      • 1970-01-01
      • 2014-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多