我有一个表Account,我正在查询它以根据销售记录识别旧帐户.一个帐户在属性表中可以有多行.物业可能会被关闭.如果帐户上的所有属性都已关闭,则应按旧帐户退还该帐户.

我如何确定所有物业都已关闭的帐户?

此外,如果客户在24个月内未购买服务,则视为旧帐户.

例如,给出下表:

-- ACCOUNT --
+-------+-----------------------------------+
| ac_id | ac_email                          |
+-------+-----------------------------------+
|  1416 | bob@bob.com                       |
|  1419 | joe@joe.com                       |
+-------+-----------------------------------+

-- PROPERTY --

+------+---------------+-------+
| p_id | p_closed      | ac_id |
+------+---------------+-------+
|    3 |  FALSE        |  1416 |
|    6 |  TRUE         |  1419 |
|    7 |  TRUE         |  1419 |
+------+---------------+-------+

--SERVICE--

+------+------------+
| p_id | s_saledate |
+------+------------+
|    3 | 2010-03-17 |
|    3 | 2011-02-16 |
|    6 | 2022-11-14 |
|    7 | 2022-01-24 |
+------+------------+

我预计会有以下退回的桌子

+------------+-----------------------+-----------------------+--------------+------------+--------------+------------------+
| account_id | email                 | all_properties_closed | property_ids | latest_sale_date |
+------------+-----------------------+-----------------------+--------------+------------+--------------+------------------+
|       1416 | bob@bob.com           |       FALSE           |     9            | 2011-02-16       |
|       1419 | joe@joe.com           |       TRUE            |    6,7           | 2022-11-14       |
+------------+-----------------------+----------------+---------------------------+--------------+------------------+

Bob的账户退还是因为他已经两年没有服务了,而Joe的账户退还是因为他已经服务了两年,但他的所有房产都被关闭了.

这是我当前的查询

 SELECT
 ac_id as account_id,
 GROUP_CONCAT(DISTINCT p_id) as property_ids,
 MAX(sale_date) as latest_sale_date
 FROM Account
 JOIN Property USING (ac_id)
 JOIN Service USING (p_id)
 GROUP BY ac.ac_id
 HAVING latest_sale_date < 2021-03-31

我想我需要使用ALL运算符和WHERE来获取ALL_PROPERTIES_CLOSED列,但我不确定如何获取.我需要一个子查询吗?

推荐答案

您可以使用条件聚合计算all_properties_closed.假设p_closed的数据类型类似于字符串,则如下所示:

SELECT
    ac_id as account_id,
    MIN(p_closed = 'FALSE') all_properties_closed
    GROUP_CONCAT(DISTINCT p_id) as property_ids,
    MAX(sale_date) as latest_sale_date
FROM Account
JOIN Property USING (ac_id)
JOIN Service USING (p_id)
GROUP BY ac.ac_id
HAVING latest_sale_date < 2021-03-31 OR all_properties_closed

如果组中的任何p_closed具有非'FALSE'值,则表达式MIN(p_closed = 'FALSE')生成0,否则返回1;我们可以使用此信息在HAVING子句中进行筛选.

在正常使用中,您在第p_closed列中会有一个0/1标志,我们可以这样做:

MIN(p_closed) all_properties_closed

Mysql相关问答推荐

是否有一种方法可以在mysql中设置一列,使其自动成为该行的行号的值?

更新MySQL表中子记录的序号

如何在MySQL中检索两列的值不同的行

SQL不断返回查询失败,并且不知道从这里到哪里go

SQL Select 最大值和平均值

MySQL MDL(元数据锁)为什么会导致死锁?

MySQL中的where语句会 destruct 全外连接.

根据 JOIN 结果计算列中的值?

任何值的 SQL WHERE 子句?

有人可以帮我用 R 编程解决这个问题吗?

为什么这个查询需要超过 5 秒才能运行?

MySQL 8.0.30 正则表达式词匹配特殊字符

从 SQL 中的左连接和内连接中减go 计数

如何在 SQL 中的一行中查找最小值和最大值?

减少mysql中的值但不是负数

将 MySQL 查询的输出转换为 utf8

MySQL SELECT 增量计数器

MySQL查询/子句执行顺序

Sequelize:销毁/删除表中的所有记录

MySQL 的最大并发连接数