通过在 Oracle Apex 中创建视图将 cols 转换为 oracle 中的行

Posted

技术标签:

【中文标题】通过在 Oracle Apex 中创建视图将 cols 转换为 oracle 中的行【英文标题】:convert the cols to rows in oracle by creating view in Oracle Apex 【发布时间】:2020-05-22 08:42:23 【问题描述】:

我正在 Oracle Apex 中创建轮班表, 我创建了一个表格来输入详细信息并保存在表格中,表格数据如下所示。

我想在顶点页面中显示如下数据。

如何传输数据?我正在尝试创建一个动态视图,尝试不同的制作方式但没有运气,请建议。

【问题讨论】:

如果您使用插入语句而不是图像文件发布实际的创建表语句,那么容易得多。您只需不到 2 分钟即可生成该数据,而我们需要更长的时间来重新创建您的数据。 感谢您的回复,您能更具体地说明您的建议吗?我没有使用任何图像文件上传。我拍了一张表格数据的快照并发布以供参考。 在您的问题中,您使用了图像而不是可运行的代码。我们需要手动输入以重现您的情况...***.com/questions/5963269/… 【参考方案1】:

您不需要动态视图...一个月总是介于 28 到 31 天之间,因此您可以创建一个包含 32 列(员工 + 31 天)的视图。每天创建一个带有案例语句的列,以确定该员工是否有轮班。以下是一个月的 5 天和一个月的最后 4 天的示例(您可以轻松填写​​剩余天数):

WITH 
FUNCTION is_valid_date (date_str_i VARCHAR2, format_i VARCHAR2) RETURN VARCHAR2
/* check if date is valid */
AS
  l_dummy_dt DATE;
  date_not_valid_for_m EXCEPTION;
  PRAGMA EXCEPTION_INIT(date_not_valid_for_m, -01839);  
BEGIN
  SELECT TO_DATE(date_str_i,format_i) INTO l_dummy_dt FROM DUAL;
  RETURN 'Y';
EXCEPTION WHEN date_not_valid_for_m THEN
  RETURN 'N';
END; 
mymonth(monthname,yr) AS (SELECT 'FEB','2020' FROM dual)
,mydata (employee, shift, the_from, the_to) AS
(SELECT 'Deepa', 'A',TO_DATE('02-FEB-2020','DD-MON-YYYY'),TO_DATE('31-MAY-2020','DD-MON-YYYY') FROM DUAL
 UNION
 SELECT 'Srini', 'M',TO_DATE('02-FEB-2020','DD-MON-YYYY'),TO_DATE('04-MAY-2020','DD-MON-YYYY') FROM DUAL  
)
,myschedule (employee,day01,day02,day03,day04,day05,day28,day29,day30,day31)
AS
(
SELECT 
d.employee,
CASE WHEN TO_DATE('01-'||m.monthname||'-'||m.yr,'DD-MON-YYYY') BETWEEN d.the_from AND d.the_to THEN d.shift ELSE NULL END,
CASE WHEN TO_DATE('02-'||m.monthname||'-'||m.yr,'DD-MON-YYYY') BETWEEN d.the_from AND d.the_to THEN d.shift ELSE NULL END,
CASE WHEN TO_DATE('03-'||m.monthname||'-'||m.yr,'DD-MON-YYYY') BETWEEN d.the_from AND d.the_to THEN d.shift ELSE NULL END,
CASE WHEN TO_DATE('04-'||m.monthname||'-'||m.yr,'DD-MON-YYYY') BETWEEN d.the_from AND d.the_to THEN d.shift ELSE NULL END,
CASE WHEN TO_DATE('05-'||m.monthname||'-'||m.yr,'DD-MON-YYYY') BETWEEN d.the_from AND d.the_to THEN d.shift ELSE NULL END,
CASE WHEN TO_DATE('28-'||m.monthname||'-'||m.yr,'DD-MON-YYYY') BETWEEN d.the_from AND d.the_to THEN d.shift ELSE NULL END,
CASE WHEN is_valid_date(date_str_i => '29-'||m.monthname||'-'||m.yr,format_i => 'DD-MON-YYYY') = 'Y' 
  THEN
    CASE WHEN TO_DATE('29-'||m.monthname||'-'||m.yr,'DD-MON-YYYY') BETWEEN d.the_from AND d.the_to THEN d.shift ELSE NULL END
  ELSE 
    NULL
  END,
CASE WHEN is_valid_date(date_str_i => '30-'||m.monthname||'-'||m.yr,format_i => 'DD-MON-YYYY') = 'Y' 
  THEN
    CASE WHEN TO_DATE('30-'||m.monthname||'-'||m.yr,'DD-MON-YYYY') BETWEEN d.the_from AND d.the_to THEN d.shift ELSE NULL END
  ELSE 
    NULL
  END,
CASE WHEN is_valid_date(date_str_i => '31-'||m.monthname||'-'||m.yr,format_i => 'DD-MON-YYYY') = 'Y' 
  THEN
    CASE WHEN TO_DATE('31-'||m.monthname||'-'||m.yr,'DD-MON-YYYY') BETWEEN d.the_from AND d.the_to THEN d.shift ELSE NULL END
  ELSE 
    NULL
  END

FROM mydata d,mymonth m
)
SELECT * FROM myschedule;

现在剩下 1 个问题,那就是如何合并 Krish 和 Rahul 的行。您可以执行如下所示的操作:Oracle SQL: Merge rows into single row

【讨论】:

非常感谢您解决这个问题,这正是我正在寻找的。来到第 1 期,我可以通过将月份和年份解析为下面的代码来打印一个月的天数,以便它判断一个月是否有 29/30/31。但令人困惑的是,我可以在给定代码中的确切位置放置此代码。 SELECT TO_DATE ('01-' || '&Month' || '-' || '&year', 'DD-MON-YYYY') + LEVEL - 1 FROM DUAL CONNECT BY LEVEL <= 31 AND TO_CHAR ( TO_DATE ('01-' || '&Month' || '-' || '&year', 'DD-MON-YYYY') + LEVEL - 1, 'MON') = '&Month' 如果是你要找的,你能把答案标记为正确吗? 该代码每行生成一天。你想用它做什么?您不再需要它,因为在我的解决方案中,您每个月每天都有 1 列。 CASE WHEN TO_DATE('01-'||m.monthname||'-'||m.yr,'DD-MON-YYYY') BETWEEN d.the_from AND d.the_to THEN d.shift ELSE NULL END, 用于第 1 天,下一列用于第 2 天等。您不再需要每天生成其他代码。 更新了我的答案以包含第 28 天到第 31 天的列,并检查有效日期 非常感谢,最后几个关注。**1)** 由于我们正在更新名称(本例为“Deepa”)并在此处手动更新开始和结束日期(SELECT 'Deepa', 'A',TO_DATE('02-FEB-2020','DD-MON-YYYY'),TO_DATE('31-MAY-2020','DD-MON-YYYY') FROM DUAL,是吗可以直接从表myschedule 2) 引用dayNN ((employee,day01,day02,day03,day04,day05,day28,day29,day30,day31)),是否可以用月份名称替换“dayNN”,如May01..,从 table.final 目标中获取开始/结束日期的月份名称和日期,使其在其他月份变得动态而不是手动【参考方案2】:

我相信你需要 unpivot。请参阅此博客文章:

https://blogs.oracle.com/sql/how-to-convert-rows-to-columns-and-back-again-with-sql-aka-pivot-and-unpivot

还有这个:http://www.gras-s-roots-oracle.com/2014/08/demystifying-oracle-unpivot.html

【讨论】:

以上是关于通过在 Oracle Apex 中创建视图将 cols 转换为 oracle 中的行的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Oracle Apex 中创建包含文件的列表

在交互式报表中创建列链接 -Oracle Apex

在 Oracle 自治数据库中,尝试使用 apex_util.create_user 在 plsql 程序中创建工作区。但失败了

触发器共同在oracle apex应用程序中工作

如何在 Oracle APEX 中设置 SPOOL 脚本以将视图数据导出为 CSV?

将应用程序导入/导出到新环境时的 Oracle APEX 应用程序安全性