【问题标题】:How to Combine multiple rows value into one row of another table in oracle?如何将多行值合并到oracle中另一个表的一行中?
【发布时间】:2017-12-21 18:45:27
【问题描述】:

我知道我的问题标题不对,很抱歉。我真正想做的是: 我有 2 个表,即 Account Table 和 History 表,如下所示- 账户表

BranchID  | AccountNo
101       |  123456
102       |  123456
102       |  123457

历史表

BranchID |  AccountNo   EmployeeName  | EmployeeType
101      |   123456   |   Mr. ABC     |   PMO
101     |    123456   |  Mr. TRY      |   RO
101     |    123456   |   Mr. OPR     |   Ref
102      |   123456   |   Mr. WER     |   PMO
102      |   123456   |   Mr. CVB     |   Ref
102      |   123457   |   Mr. QSR     |   PMO
102      |   123457   |   Mr. LIT     |   RO
102     |    123457   |   Mr. GHK     |   Ref

我想要一个组合结果为-

BranchID  | AccountNo | PMOName |   ROName |    RefName
101       |  123456   | Mr. ABC | Mr. TRY  |   Mr. OPR
102       |  123456   | Mr. WER |          |    Mr. CVB
102       |  123457   | Mr. QSR | Mr. LIT  |   Mr. GHK

我怎样才能做到这一点?

【问题讨论】:

  • 到目前为止必须尝试编写什么查询?
  • 你在找listagg()
  • 在 Account Table.BranchID=History Table.BranchID 的两个表上使用内部联接,并且选择列包含 BranchID |帐号 | PMO名称 | RO名称 | RefName 顺便说一下是 sql 概念。
  • SELECT t1.BranchID, t1.AccountNo max(decode(ji.ro_type_id, '001', ji.employee_code, 'NA')) as pmo, max(decode(ji.ro_type_id, '001 ', ji.employee_nm, 'NA')) as pmo, max(decode(ji.ro_type_id, '002', ji.employee_code, 'NA')) as rm FROM Account t1 LEFT JOIN (SELECT t.BranchID, t. AccountNo, t.EmployeeName FROM History t GROUP BY t.BranchID, t.AccountNo, t.EmployeeName)t2 ON t2.BranchID=t1.BranchID AND t2.AccountNo=t1.AccountNo

标签: sql oracle string-aggregation


【解决方案1】:

这是基本的透视查询:

select * 
  from account join history using (branchid, accountno)
  pivot (max(employeename) for employeetype in ('PMO' pmo, 'RO' ro, 'Ref' ref))
  order by branchid, accountno

BRANCHID ACCOUNTNO PMO        RO         REF
-------- --------- ---------- ---------- ----------
     101    123456 Mr. ABC    Mr. TRY    Mr. OPR
     102    123456 Mr. WER               Mr. CVB
     102    123457 Mr. QSR    Mr. LIT    Mr. GHK

【讨论】:

    【解决方案2】:

    以下查询应获取所需的详细信息。它会做的是—— 遍历所有帐户,然后根据员工类型获取不同的员工姓名。您也可以通过连接来实现。

    SELECT account.branchid BranchID,
        account.accountno AccountNo,
        (SELECT employeename
        FROM history
        WHERE account.branch_id  = history.branch_id
        AND account.accountno    = history.accountno
        AND history.employeetype = 'PMO'
        ) PMOName,
        (SELECT employeename
        FROM history
        WHERE account.branch_id  = history.branch_id
        AND account.accountno    = history.accountno
        AND history.employeetype = 'RO'
        ) ROName,
        (SELECT employeename
        FROM history
        WHERE account.branch_id  = history.branch_id
        AND account.accountno    = history.accountno
        AND history.employeetype = 'Ref'
        ) RefName
    FROM account
    ;
    

    【讨论】:

    • 不适用于每个帐号,最多返回空行。
    • @KayserAhmed 那么您的employeetype 字段中可能有不同的值或history 表中的数据较少
    猜你喜欢
    • 1970-01-01
    • 2014-05-29
    • 1970-01-01
    • 2021-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多