如何从一个表中获取包含另一表的详细信息的记录计数

Posted

技术标签:

【中文标题】如何从一个表中获取包含另一表的详细信息的记录计数【英文标题】:How do I get a count of records from one table with detail from another table 【发布时间】:2021-09-26 17:14:27 【问题描述】:

在 Oracle 中,我有两个表,USER 和 USER_DETAIL。 USER_DETAIL 表有一个指向 USER 表的外键链接,非常标准。 USER 表包含 USER_ID 和 ACCOUNT_NUM 字段等,而 USER_DETAIL 包含更多数据,例如 USER_ID 和 IBAN。

场景是多个用户可以拥有相同的 IBAN。我要做的是创建一个查询,显示多个用户正在使用同一个 IBAN 的位置,以及每个 IBAN 的用户数量和帐号列表。

数据库表:

USER                    USER_DETAIL
________                ________
USER_ID    ACCOUNT_NUM  USER_ID    IBAN
1,         ACC001       1,         IBAN001
2,         ACC002       2
3,         ACC003       3,         IBAN002
4,         ACC004       4,         IBAN001

我试图达到的查询结果(显示 IBAN001 正在被 ACC001 和 ACC004 使用):

COUNT    IBAN    ACCOUNT_NUM
2        IBAN001 ACC001
                 ACC004

             

让我困惑的部分是 JOIN 和 GROUP BY。这可以获取计数和 IBAN:

SELECT COUNT(ud.user_id) AS num_users, ud.iban 
FROM user_detail ud
WHERE ud.iban IS NOT NULL
GROUP BY iban
HAVING COUNT(ud.user_id) > 1
ORDER BY ud.iban

但是当我尝试加入 USER 表并使用每个 IBAN 显示所有帐号时,我要么收到“不是 GROUP BY 表达式”错误,要么计数丢失:

SELECT COUNT(ud.user_id) AS num_users, ud.iban, u.account_num 
FROM user u 
INNER JOIN user_detail ud USING (user_id)
WHERE ud.iban IS NOT NULL
GROUP BY ud.iban, u.account_num
HAVING COUNT(ud.user_id) > 1
ORDER BY ud.iban

【问题讨论】:

【参考方案1】:

如果我理解正确,您希望LISTAGG() 在聚合结果中将帐户组合在一起:

SELECT ud.iban, COUNT(*) as num_users,
       LISTAGG(u.account_num, ',') WITHIN GROUP (ORDER BY u.account_num)
FROM user u INNER JOIN
     user_detail ud
     USING (user_id)
WHERE ud.iban IS NOT NULL
GROUP BY ud.iban
HAVING COUNT(*) > 1
ORDER BY ud.iban

【讨论】:

嗨@Gordon Linoff 感谢您立即开始工作。是否可以为每个帐号获取一行,只有第一行有计数和 iban? @some_randomer 。 . .您可以使用row_number() over (order by null) 添加连续的行号。

以上是关于如何从一个表中获取包含另一表的详细信息的记录计数的主要内容,如果未能解决你的问题,请参考以下文章

计算一个表中与另一表中的条件匹配的记录

如何从一个表中获取另一表中不存在的行

从一个表中选择与客户关联的工单记录或另一表中的客户子项

如何从一个表中删除与另一表匹配的行?

Sequelize - 如何从一个表中获取未被另一表关联的条目

如何解决ORACLE中表一得列名的别名为另一表中的某一字段的值?