【问题标题】: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

【问题讨论】:

    标签: sql oracle join plsql group-by


    【解决方案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) 添加连续的行号。
    猜你喜欢
    • 2022-11-27
    • 2020-09-10
    • 2021-07-16
    • 2014-01-26
    • 2012-04-30
    • 2020-11-24
    • 2016-09-03
    • 2013-04-12
    • 2015-11-11
    相关资源
    最近更新 更多