根据另一列的值在单元格中显示 LISTAGG 值
Posted
技术标签:
【中文标题】根据另一列的值在单元格中显示 LISTAGG 值【英文标题】:Displaying LISTAGG values in a cell based on the value of another column 【发布时间】:2018-05-16 08:04:15 【问题描述】:我正在完成一项任务,并且非常接近完成,但是,我一直在努力解决其中的一个问题。我需要显示一个具有 SCHEDULE 列和 DAYS 列的表,其中 DAYS 列显示基于 SCHEDULE 的天数列表。 SCHEDULE 只有两个选项:“周末”和“工作日”。
这是我想要达到的最终结果:
ID Schedule Days
001 Weekend Saturday, Sunday
我已经创建了一个进程并且正在使用这个代码:
BEGIN
UPDATE schedules
SET days =
WHEN schedule = 'Weekend' THEN
(SELECT LISTAGG(day, ', ') WITHIN GROUP (ORDER BY day_order)
FROM days
WHERE schedule = 'Weekend'
)
WHEN schedule = 'Weekday' THEN
(SELECT LISTAGG(day, ', ') WITHIN GROUP (ORDER BY day_order)
FROM days
WHERE schedule = 'Weekday'
)
END
当我这样做时,我得到了错误:
在预期以下情况之一时遇到符号“文件结尾”:begin function pragma procedure
如果有人能帮帮我,将不胜感激!
【问题讨论】:
您要使用CASE
表达式吗?如果是,那么您错过了一个 CASE
和一个 END
关键字。如果不是,那么您的查询语法是错误的。
仅使用逗号分隔值进行显示。不要将它们存储在表中。
你为什么使用UPDATE
?
我正在使用更新,因为它是一个过程,我需要天数列来显示值。我明白你们都在说存储值。我还有什么方法可以解决这个问题?
【参考方案1】:
你的更新相当于这个。
UPDATE schedules s
SET days = (SELECT LISTAGG(day, ', ')
within group ( ORDER BY day_order )
FROM days d
WHERE d.schedule IN ( 'Weekend', 'Weekday' )
AND d.schedule = s.schedule
GROUP BY d.schedule ) ;
但是,我不推荐这个。将记录存储为逗号分隔值肯定会在将来给您带来问题。仅使用它来使用如下查询显示结果。这假设在您的 days 表中,每一天都有唯一的行。如果有重复,join
将其添加到 days 的不同结果集。
SELECT d.id,
d.schedule,
LISTAGG(s.day, ', ')
within GROUP ( ORDER BY d.day_order )
FROM days d
join schedules s
ON ( d.schedule = s.schedule )
WHERE d.schedule IN ( 'Weekend', 'Weekday' )
GROUP BY d.id,
d.schedule
【讨论】:
感谢您的回答!我使用了您提供的更新命令,它是有效的。我应该提一下,我使用的是 Oracle APEX,为了连接这两个表,中间还有第三个表。 days 表通过 Day_ID 链接到 SCHEDULE_DAY 表,然后 SCHEDULE_DAY 通过 SCHEDULE_ID 链接到 SCHEDULE。 (不是我的选择,任务是如何设置的)。我确实编辑了您的代码以适应。 我现在明白你所说的存储与显示问题是什么意思了。有没有办法简单地在表格中显示它?这就是我一直在努力实现的目标,但没有成功。 @HassanNaveed:不客气。我希望这个问题能回答您原始帖子中的问题。如果您发现此答案有用,请投票或接受答案。如果您还有其他问题要解决,请将其作为单独的问题发布。谢谢。【参考方案2】:您可以使用MERGE
声明:
MERGE INTO schedules dst
USING (
SELECT schedule,
LISTAGG( day, ', ' ) WITHIN GROUP ( ORDER BY day_order ) AS days
FROM days
GROUP BY schedule
) src
ON ( dst.schedule = src.schedule )
WHEN MATCHED THEN
UPDATE SET days = src.days;
但您最好不要将值存储在分隔列表中,而只使用schedules.schedule
和days.schedule
之间的外键引用来连接两个表。
【讨论】:
我尝试创建一个外键,但它不允许我这样做。我使用上述解决方案来做到这一点。以上是关于根据另一列的值在单元格中显示 LISTAGG 值的主要内容,如果未能解决你的问题,请参考以下文章
EXCEL中在某列中查找指定文本,返回行对应另一列的数据用啥函数
如何在 OpenOffice 中将一列单元格从一张表插入到另一张表的单个单元格中?