如何从一个表中获取包含另一表的详细信息的记录计数
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)
添加连续的行号。以上是关于如何从一个表中获取包含另一表的详细信息的记录计数的主要内容,如果未能解决你的问题,请参考以下文章