将行输出组合以进行多列检查

时间:2016-04-19 19:55:42

标签: plsql listagg

我希望根据多列检查将多行合并为一行。 enter image description here

仅当所有剩余列都匹配时,Program_Type才会以逗号分隔的方式合并。

我尝试使用listagg,但我无法实现它。我也尝试使用connect by但仍然无法检查所有条件。

对此有任何帮助。

问候。

2 个答案:

答案 0 :(得分:1)

像这样的东西

select 
listagg(PROGRAM_TYPE,',')
within group ( order by PROGRAM_TYPE DESC ) as PROG_GROUP
from emp 

<强>输出:

XYZ,MNO

此外,如果您希望在单个查询中包含所有列

With PROGRAM1_TYPE 
as (
select distinct id,prog_type
from
(
select id,listagg(PROGRAM_TYPE,',') within group ( order by PROGRAM_TYPE DESC ) 
over (partition by id ) prog_type
from emp
)
)select distinct e.id,e.name,prog_type PROGRAM_TYPE,
e.MNAME,e.type --add remaining columns here
from  PROGRAM1_TYPE p,emp e 
where p.id=e.id

O / p -Screenshot

enter image description here

答案 1 :(得分:0)

如果您只需要一个或两个需要简化的大表,那么您可以通过几个步骤轻松完成此操作

  1. 按需要相同的任何列(例如ID)排序。
  2. 在一个额外的列中写一个函数来检测哪些行与下面的行相同,哪些不是 - 第3行的行 - IF(AND(A3 = A4,B3 = B4),&# 34;相同的&#34;&#34;最后&#34;。)
  3. 在另一列中添加一个等式来连接程序类型,如果行是相同的,例如。 = IF(F3 =&#34;最后&#34;,C4,G3&amp;&#34;,&#34;&amp; C4)
  4. 一旦值到位,请复制并粘贴结果&#34;在两列上(所以你的值不是方程式)
  5. 按相同/最后一列排序,保持&#34;最后一次&#34;行并丢弃&#34;相同&#34;
  6. 当然,如果您需要反复执行此操作,那么这是一个麻烦的解决方案,您可能应该使用宏或数据库程序。