繁体   English   中英

如何使用LISTAGG清理此报告?

[英]How can I clean up this report using LISTAGG?

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

doc_number | 领域 文本

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

我需要基于许多其他参数从该表中提取特定字段,并将其汇总到一行中,并消除这些汇总文本包含关键字或短语的行(“抑制显示”)。 使用SQL Fiddle设置中的查询,我得到了我不需要的行(带有“ Suppress display”的行)一式三份。 如果我使用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:如何(如果可能)基于聚合文本来限制查询?

如果我对您的理解正确,则可以从查询中进行选择,并按两列进行分组: 更新了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

只需删除分区,并加入一个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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM