根据另一列中的值显示listagg值(第2部分)

时间:2018-05-17 08:25:13

标签: sql oracle oracle-apex

我之前在此发布了一个类似的问题:Displaying LISTAGG values in a cell based on the value of another column

在那个问题中,我使用UPDATE来存储以逗号分隔的列表。

我得到了一个解决方案,但我感谢贡献者,这不是最好的方法。

我正在使用Oracle APEX,需要在表格中显示这些数据。

ID   Schedule     Days
001  Weekend      Saturday, Sunday

我有3张桌子可供使用。为简单起见,它们是DAYS,SCHEDULES和DAY_SCHEDULES。

DAYS table
Day_ID - PK
Day_Order
Day_Name
Schedule (I added this column myself, the others were already provided)

SCHEDULES table
Schedule_ID - PK
Schedule (only two possible values: 'Weekend' or 'Weekday')
Days
Several other columns but not relevant

DAY_SCHEDULES table
Day_schedules_id - PK
Schedule_ID - FK
Day_ID - FK

我已经尝试了几种方法让Days列显示相应日期的列表,但似乎都没有。我的主要尝试是摆弄SELECT / CASE语句,但即使语法完全正确,它仍然不会显示任何内容。

我无法在两个表之间创建FK,因为Schedules列都不是唯一的。

我不确定接下来要尝试什么,所以感谢任何帮助或提示!

谢谢,

哈桑

1 个答案:

答案 0 :(得分:0)

我认为这是您要实现的目标(您不需要在计划表中使用DAYS列,因为您可以从days表中计算它):

SQL Fiddle

Oracle 11g R2架构设置

CREATE TABLE DAYS ( Day_ID, Day_Order, Day_Name, Schedule ) AS
SELECT LEVEL,
       LEVEL - 1,
       TO_CHAR(
         TRUNC( SYSDATE, 'IW' ) + LEVEL - 1,
         'FMDay',
         'NLS_LANGUAGE=ENGLISH'
       ),
       CASE
       WHEN LEVEL <= 5
       THEN 'Weekday'
       ELSE 'Weekend'
       END
FROM   DUAL
CONNECT BY LEVEL <= 7;

CREATE TABLE SCHEDULES ( Schedule_ID, Schedule, Other ) AS
SELECT 1, 'Weekend', 'ABC' FROM DUAL UNION ALL
SELECT 2, 'Weekday', 'DEF' FROM DUAL;

查询1

SELECT s.*,
       d.days
FROM   schedules s
       INNER JOIN
       ( SELECT schedule,
                LISTAGG( day_name, ', ' )
                  WITHIN GROUP ( ORDER BY day_order ) AS days
         FROM   days
         GROUP BY schedule ) d
       ON ( s.schedule = d.schedule )

<强> Results

| SCHEDULE_ID | SCHEDULE | OTHER |                                         DAYS |
|-------------|----------|-------|----------------------------------------------|
|           2 |  Weekday |   DEF | Monday, Tuesday, Wednesday, Thursday, Friday |
|           1 |  Weekend |   ABC |                             Saturday, Sunday |