如何使用LISTAGG清理此报告?

时间:2014-09-30 15:43:44

标签: sql oracle aggregate-functions

我有一个存储MARC21数据的Oracle表,按字段划分:

doc_number |领域|文本

我在SQL Fiddle中创建了一个示例表。数据本身大大简化了(对于6条记录,我只包括相关字段,其中所有6条在实际数据中可能只有20-30行)。

我需要根据许多其他参数从此表中提取特定字段,汇总到一行,并消除此聚合文本包含关键字或短语的行("抑制显示") 。使用SQL Fiddle设置中的查询,我得到了我不想要的行(带有"抑制显示"的行)一式三份。如果我使用WHERE子句来消除包含文本(WHERE field = '902' AND text LIKE 'Suppress')的特定字段,那么只会缩短聚合文本,而我只获得双倍而不是三倍。

查询:

SELECT doc_number,
  LISTAGG(field || '=' || text, '; ') WITHIN GROUP (ORDER BY field) OVER (PARTITION BY doc_number)
FROM record

所以A:如何使用LISTAGG消除一式三份列出的行? B:如何(如果可能)我可以根据汇总文本限制查询?

2 个答案:

答案 0 :(得分:1)

如果我理解正确,您只需从两个列中选择查询和分组: Updated SQL Fiddle

select
*
from
(
SELECT doc_number, LISTAGG(field || '=' || text, '; ') 
WITHIN GROUP (ORDER BY field) OVER (PARTITION BY doc_number) as Bob
FROM record
) t1
group by
doc_number,
bob

答案 1 :(得分:1)

只需删除分区并添加group by

SELECT   doc_number,
         LISTAGG(field || '=' || text, '; ') WITHIN GROUP (ORDER BY field)
FROM     record
GROUP BY doc_number

请参阅http://sqlfiddle.com/#!4/84488/9/0