程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了根据列值的顺序连接列值大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决根据列值的顺序连接列值

开发过程中遇到根据列值的顺序连接列值的问题如何解决?下面主要结合日常开发的经验,给出你关于根据列值的顺序连接列值的解决方法建议,希望对你解决根据列值的顺序连接列值有所启发或帮助;

我正在尝试找出一种方法,将与联名账户持有人相同的账户组合在一起。一个账户有 1 个主要人,最多有 4 个额外的联名账户持有人。虑以下示例:

帐号 主要 关节 1 关节2 Joint3 Joint4
123 标记 蒂姆 吉姆 布莱 约翰
124 标记 吉姆 蒂姆 布莱 约翰
134 吉姆 标记 蒂姆 布莱 约翰
324 雪莉 海伦
168 雪莉 海伦

所以在上面:

    @H_685_97@mark、Tim、Jim、Brian 和 John 都在帐户 123、124、134 上,我希望它们成为一组
  • Ann、SHelly 和 Helen 都在帐户 324 和 168 上,并且将组成另一个组

我正在通过使用 case 语句对 PriMary 和 Joint%s 进行排序,然后将订单连接成一个字符串,然后我可以对其进行分组来解决这个问题。因此,在 Ann、SHelly 和 Helen 的情况下 - 按字母顺序排列会给我 AnnHelen 和 SHelly,我会将这些名称连接在一起以获得“AnnHelenSHelly”并按此字符串分组。我已经开始这样做了,但是当我遇到一个帐户上有 3 或 4 个联名持有人的情况时,我发现它有点混乱。对于只有一个主要和一个关节的情况,我只是这样做:

num_joints = 1 时的情况,则最少 (priMary,joint1) ||最大的(主要的,关节 1) 当 num_joints = 2 时,则最少(主要,关节 1,关节 2)|| (当关节 1 > 最少(主要,关节 1,关节 2)和关节 1 最小(主要,关节 1,关节 2)和关节 2

但我想知道是否有更简单、更具可扩展性的方法来做到这一点,这样当我到达 num_joints = 3 或 4 时,它就不会太混乱。或者,也许还有另一种方法可以对其进行分组,而不必创建由主要持有人和联合持有人按顺序组成的字符串。

其他一些注意事项:

  • 主要条目和联合条目的 ID 都是数字且是唯​​一的 - 因此我可以按此 ID 号订购
  • Joint 条目根据帐户中的关节数量顺序填充 - 即如果帐户中有 3 个关节和一个主要,则主要有一个值,并且关节 1、关节 2 和关节 3 和关节 4 将为空白。

解决方法

使用 UNPIVOT 将列转换为行,然后使用 LISTAGG 按字母顺序聚合每个帐户的名称,然后再次使用 LISTAGG 聚合每个唯一名称列表的帐户。

这个解决方案仍然有点复杂,并没有比您的 CASE 版本简单多少,但它的扩展性很好,并且在解决方案中添加另一列也很简单。该示例使用 LISTAGG,它非常适合显示结果,但如果您要在数据库中处理结果,您的最终生产版本可能不应该使用 LISTAGG

示例架构

create table accounts
(
    account number,priMary varchar2(100),joint1 varchar2(100),joint2 varchar2(100),joint3 varchar2(100),joint4 varchar2(100)
);

insert into accounts
SELEct 123,'Mark','Tim','Jim','Brian','John' from dual union all
SELEct 124,'John' from dual union all
SELEct 134,'John' from dual union all
SELEct 324,'Ann','SHelly','Helen','',''     from dual union all
SELEct 168,''     from dual;

查询

--Accounts per group.
SELEct names,listagg(account,',') within group (order by account) accounts
from
(
    --Aggregate names into alphabetical list per account.
    SELEct
        account,listagg(account_name,') within group (order by account_Name) names
    from
    (
        --Unpivot columns into rows.
        SELEct account,acCount_Type,account_name
        from accounts
        unpivot (account_name for acCount_Type in
            (priMary as 'priMary',joint1 as 'join1',joint2 as 'joint2',joint3 as 'joint3',joint4 as 'joint4')
        )
    )
    group by account
)
group by names
order by names;

结果

NAMES                     ACCOUNTS
-----------------------   -----------
Ann,Helen,SHelly          168,324
Brian,Jim,John,Mark,Tim   123,124,134

大佬总结

以上是大佬教程为你收集整理的根据列值的顺序连接列值全部内容,希望文章能够帮你解决根据列值的顺序连接列值所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。