根据另一列的值在单元格中显示 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.scheduledays.schedule 之间的外键引用来连接两个表。

【讨论】:

我尝试创建一个外键,但它不允许我这样做。我使用上述解决方案来做到这一点。

以上是关于根据另一列的值在单元格中显示 LISTAGG 值的主要内容,如果未能解决你的问题,请参考以下文章

Pyspark:如何根据另一列的值填充空值

SQLite 在另一列的值上拆分列

EXCEL中在某列中查找指定文本,返回行对应另一列的数据用啥函数

如何在 OpenOffice 中将一列单元格从一张表插入到另一张表的单个单元格中?

如何在表格的一个列单元格中输入字母,而在另一列单元格中只输入数字?

如何根据ext js网格中另一个单元格的值向单元格添加类