【问题标题】:concate or segregate strings based on requirement根据要求连接或分离字符串
【发布时间】:2017-12-11 21:17:35
【问题描述】:
USER_ID     COLUMN1       COLUMN2

JOHN          24           CA
JOHN          24           LA
JOHN          63           CA
JOHN          63           LA
JOHN          66           CA
JOHN          66           LA
JOHN           9           AF
JOHN           9           AL
JOHN           9           AW
JOHN           9           DF

需要的输出:

USER_ID          RESULT

JOHN             24~CA-LA  +  63~CA-LA  + 66~CA-LA +  9~AF-AL-AW-DF

这是我的要求。我正在尝试listagg():

select USER_ID,
   (listagg(case when seqnum_p = 1 then COLUMN1 end, '-') within group (order by COLUMN1) ||
    '~' ||
    listagg(case when seqnum_b = 1 then COLUMN2 end, '-') within group (order by COLUMN2)
   ) as result
from (select TABLE.*,
         row_number() over (partition by USER_ID, COLUMN1 order by COLUMN1) as seqnum_p,
         row_number() over (partition by USER_ID, COLUMN2 order by COLUMN2) as seqnum_b
  from TABLE
 )
group by USER_ID;

当前输出:

JOHN         ||       AF-AL-AW-CA-DF-LA~24-63-66-9

【问题讨论】:

  • 你试过了吗? Stack Overflow 不是免费的抽水式代码编写服务。
  • :) yes select USER_ID, (listagg(case when seqnum_p = 1 then COLUMN1 end, '-') in group (order by COLUMN1) || '~' || listagg(case when seqnum_b = 1 然后 OFFICE_CODE end, '-') 在组内 (按 OFFICE_CODE 排序) 作为结果来自 (select TABLE.*, row_number() over (partition by USER_ID, COLUMN1 order by COLUMN1) as seqnum_p, row_number() over (partition by USER_ID, OFFICE_CODE order by OFFICE_CODE) as seqnum_b from TABLE ) group by USER_ID; @TimBiegeleisen
  • 我可以隔离但不符合我的正确要求@TimBiegeleisen
  • 请将其作为格式化代码添加到您的问题中,并解释其中的问题 - 错误、错误结果等。然后删除评论版本。
  • 是的,@AlexPoole 解释道

标签: sql oracle oracle11g string-concatenation listagg


【解决方案1】:

你可以做两级聚合而不是处理行号:

select user_id,
  listagg(tmp, ' + ') within group (order by tmp) as result
from (
  select user_id,
    column1 ||'~'|| listagg(column2, '-') within group (order by column2) as tmp
  from your_table
  group by user_id, column1
)
group by user_id
order by user_id;

USER RESULT                                            
---- --------------------------------------------------
JOHN 24~CA-LA + 63~CA-LA + 66~CA-LA + 9~AF-AL-AW-DF    

内部查询为您提供第一级:

USER TMP                                               
---- --------------------------------------------------
JOHN 9~AF-AL-AW-DF                                     
JOHN 24~CA-LA                                          
JOHN 63~CA-LA                                          
JOHN 66~CA-LA                                          

并且外层进一步将这些聚合到每个用户的单个字符串中。

外部查询聚合中的 order-by 是一个以数字开头的字符串,它将 '9~...' 放在 '24~...' 之后,这通常很奇怪,但似乎是您所期望的。

如果您确实希望它们以数字列 1 顺序排列,您可以将其包含在子查询中并将其用于排序:

select user_id,
  listagg(tmp, ' + ') within group (order by column1) as result
from (
  select user_id, column1,
    column1 ||'~'|| listagg(column2, '-') within group (order by column2) as tmp
  from your_table
  group by user_id, column1
)
group by user_id
order by user_id;

USER RESULT                                            
---- --------------------------------------------------
JOHN 9~AF-AL-AW-DF + 24~CA-LA + 63~CA-LA + 66~CA-LA    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-27
    • 1970-01-01
    • 1970-01-01
    • 2015-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多