通过在 Oracle Apex 中创建视图将列转换为 oracle 中的行
convert the cols to rows in oracle by creating view in Oracle Apex
我正在 Oracle Apex 中创建轮班表,
我创建了一个表单来输入详细信息并将其保存在 table 中,table 数据如下所示。
我想在顶点页面显示如下数据。
如何传输数据?我正在尝试创建一个动态视图,尝试了不同的制作方法但没有成功,请提出建议。
我相信你需要 unpivot。查看此博客 post:
还有这个:http://www.grassroots-oracle.com/2014/08/demystifying-oracle-unpivot.html
您不需要动态视图...一个月总是在 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
我正在 Oracle Apex 中创建轮班表, 我创建了一个表单来输入详细信息并将其保存在 table 中,table 数据如下所示。
我想在顶点页面显示如下数据。
如何传输数据?我正在尝试创建一个动态视图,尝试了不同的制作方法但没有成功,请提出建议。
我相信你需要 unpivot。查看此博客 post:
还有这个:http://www.grassroots-oracle.com/2014/08/demystifying-oracle-unpivot.html
您不需要动态视图...一个月总是在 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