turnus 等于 1 的查询中所有行的 Return
Return of all rows from a query where the turnus is equal to 1
我有一个 Oracle Apex 函数,它给出一个日期范围内的一系列行。序列中选取的项目来自名为 TURNUS 的标识符。例如:
日期范围:2016 年 11 月 1 日至 2016 年 11 月 30 日
TURNUS 是:7
Return 是:
2016 年 11 月 1 日
2016 年 11 月 7 日
2016 年 11 月 14 日
2016 年 11 月 21 日
2016 年 11 月 29 日
如果我将 TURNUS 更改为 1,我得到 return 的:
2016 年 11 月 1 日
我想看的是:
2016 年 11 月 1 日
2016 年 11 月 2 日
...
2016 年 11 月 30 日
为了接收结果,我在 Oracle APEX 应用程序的前端使用查询,该查询从我在数据库中创建的视图中选取数据。
让我们从table的内容开始:
数据库 table 是:
CREATE TABLE "GROUPS"
( "PK_ID" NUMBER,
"NAME_OF_GROUP" VARCHAR2(120),
"SEATS" NUMBER,
"DATE_FROM" DATE,
"TURNUS" VARCHAR2(120),
"CREATE_DATE" DATE,
"CREATED_BY" VARCHAR2(120),
"FK_PUBLIC_FUNDING_BODY" NUMBER,
"VALID_TILL" DATE,
"DELETE_FLAG" NUMBER,
"DESCRIPTION" VARCHAR2(300),
"DATETIME_FROM" TIMESTAMP (6),
"DATETIME_TILL" TIMESTAMP (6),
"TIMEFROM" TIMESTAMP (6),
"TIMETILL" TIMESTAMP (6),
"DURATION" NUMBER,
"FK_ROOM_ID" NUMBER,
"DELETE_DATE" DATE,
"GROUP_DELETE_REASON" VARCHAR2(255),
CONSTRAINT "GROUPS_PK" PRIMARY KEY ("PK_ID")
USING INDEX ENABLE
)
在此之后我创建了一个视图:
CREATE OR REPLACE FORCE VIEW "VIEW_GROUP_DATERANGE" (
"DAY", "PK_ID", "TURNUS", "NAME_OF_GROUP",
"FK_PUBLIC_FUNDING_BODY", "TIME_FROM", "TIME_TILL",
"DATETIME_FROM", "DATETIME_TILL", "D_FROM", "D_TO") AS
with
T_from_to as (
select
trunc(DATETIME_FROM) as d_from,
trunc(DATETIME_TILL) as d_to,
DATETIME_FROM as DATETIME_FROM,
DATETIME_TILL as DATETIME_TILL,
PK_ID,
TURNUS,
NAME_OF_GROUP,
FK_PUBLIC_FUNDING_BODY
FROM GROUPS
),
T_seq as (
select level-1 as delta
from dual
connect by level-1 <= (select max(d_to-d_from) from T_from_to)
)
select d_from + delta as DAY, PK_ID, TURNUS, NAME_OF_GROUP,
FK_PUBLIC_FUNDING_BODY, TO_CHAR(DATETIME_FROM,'HH.MI') as TIME_FROM,
TO_CHAR(DATETIME_TILL,'HH.MI') as TIME_TILL, DATETIME_FROM, DATETIME_TILL,
d_from, d_to
from T_from_to, T_seq
where d_from + delta <= d_to
order by day
/
前端查询:
SELECT rownum, ID, DAY, d_from, d_to, TURNUS,
NAME_OF_GROUP
FROM VIEW_GROUP_DATERANGE
WHERE ID= 1 (Variable ID of the Group)
GROUP BY rownum, ID, DAY, d_from, d_to, TURNUS, NAME_OF_GROUP
HAVING MOD(rownum,TURNUS) = 0 OR rownum = 2-1
ORDER BY rownum
除 TURNUS =“1”外,结果显示正确。它只有 return 一行。我目前 运行 想不出一个序列,当 TURNUS 为“1”时,该序列 return 是日期范围内的任何一行。
我考虑并尝试了一些 CASE 语句但没有成功。
非常感谢您。
我通过在名为 "MOD_TURNUS" 的视图中添加另一列来解决它,该列有一个 case 语句
T_from_to as (
select
trunc(DATETIME_FROM) as d_from,
trunc(DATETIME_TILL) as d_to,
DATETIME_FROM as DATETIME_FROM,
DATETIME_TILL as DATETIME_TILL,
PK_ID,
TURNUS,
CASE WHEN TURNUS > 1 THEN 1 ELSE 0 END as MOD_TURNUS,
NAME_OF_GROUP,
FK_PUBLIC_FUNDING_BODY
FROM GROUPS
),
T_seq as (
select level-1 as delta
from dual
connect by level-1 <= (select max(d_to-d_from) from T_from_to)
)
select d_from + delta as DAY, PK_ID, TURNUS,
CASE WHEN TURNUS > 1 THEN 1 ELSE 0 END as MOD_TURNUS,
NAME_OF_GROUP, FK_PUBLIC_FUNDING_BODY, TO_CHAR(DATETIME_FROM,'HH.MI') as TIME_FROM,
TO_CHAR(DATETIME_TILL,'HH.MI') as TIME_TILL, DATETIME_FROM, DATETIME_TILL, d_from, d_to
from T_from_to, T_seq
where d_from + delta <= d_to
order by day
在我的前端查询中,我将 HAVING 语句更改为并将 MOD_TURNUS 添加到 Group 函数。
HAVING MOD(rownum,TURNUS) = MOD_TURNUS
...终于这么简单了
我有一个 Oracle Apex 函数,它给出一个日期范围内的一系列行。序列中选取的项目来自名为 TURNUS 的标识符。例如:
日期范围:2016 年 11 月 1 日至 2016 年 11 月 30 日
TURNUS 是:7
Return 是:
2016 年 11 月 1 日
2016 年 11 月 7 日
2016 年 11 月 14 日
2016 年 11 月 21 日
2016 年 11 月 29 日
如果我将 TURNUS 更改为 1,我得到 return 的:
2016 年 11 月 1 日
我想看的是:
2016 年 11 月 1 日
2016 年 11 月 2 日
...
2016 年 11 月 30 日
为了接收结果,我在 Oracle APEX 应用程序的前端使用查询,该查询从我在数据库中创建的视图中选取数据。
让我们从table的内容开始:
数据库 table 是:
CREATE TABLE "GROUPS"
( "PK_ID" NUMBER,
"NAME_OF_GROUP" VARCHAR2(120),
"SEATS" NUMBER,
"DATE_FROM" DATE,
"TURNUS" VARCHAR2(120),
"CREATE_DATE" DATE,
"CREATED_BY" VARCHAR2(120),
"FK_PUBLIC_FUNDING_BODY" NUMBER,
"VALID_TILL" DATE,
"DELETE_FLAG" NUMBER,
"DESCRIPTION" VARCHAR2(300),
"DATETIME_FROM" TIMESTAMP (6),
"DATETIME_TILL" TIMESTAMP (6),
"TIMEFROM" TIMESTAMP (6),
"TIMETILL" TIMESTAMP (6),
"DURATION" NUMBER,
"FK_ROOM_ID" NUMBER,
"DELETE_DATE" DATE,
"GROUP_DELETE_REASON" VARCHAR2(255),
CONSTRAINT "GROUPS_PK" PRIMARY KEY ("PK_ID")
USING INDEX ENABLE
)
在此之后我创建了一个视图:
CREATE OR REPLACE FORCE VIEW "VIEW_GROUP_DATERANGE" (
"DAY", "PK_ID", "TURNUS", "NAME_OF_GROUP",
"FK_PUBLIC_FUNDING_BODY", "TIME_FROM", "TIME_TILL",
"DATETIME_FROM", "DATETIME_TILL", "D_FROM", "D_TO") AS
with
T_from_to as (
select
trunc(DATETIME_FROM) as d_from,
trunc(DATETIME_TILL) as d_to,
DATETIME_FROM as DATETIME_FROM,
DATETIME_TILL as DATETIME_TILL,
PK_ID,
TURNUS,
NAME_OF_GROUP,
FK_PUBLIC_FUNDING_BODY
FROM GROUPS
),
T_seq as (
select level-1 as delta
from dual
connect by level-1 <= (select max(d_to-d_from) from T_from_to)
)
select d_from + delta as DAY, PK_ID, TURNUS, NAME_OF_GROUP,
FK_PUBLIC_FUNDING_BODY, TO_CHAR(DATETIME_FROM,'HH.MI') as TIME_FROM,
TO_CHAR(DATETIME_TILL,'HH.MI') as TIME_TILL, DATETIME_FROM, DATETIME_TILL,
d_from, d_to
from T_from_to, T_seq
where d_from + delta <= d_to
order by day
/
前端查询:
SELECT rownum, ID, DAY, d_from, d_to, TURNUS,
NAME_OF_GROUP
FROM VIEW_GROUP_DATERANGE
WHERE ID= 1 (Variable ID of the Group)
GROUP BY rownum, ID, DAY, d_from, d_to, TURNUS, NAME_OF_GROUP
HAVING MOD(rownum,TURNUS) = 0 OR rownum = 2-1
ORDER BY rownum
除 TURNUS =“1”外,结果显示正确。它只有 return 一行。我目前 运行 想不出一个序列,当 TURNUS 为“1”时,该序列 return 是日期范围内的任何一行。
我考虑并尝试了一些 CASE 语句但没有成功。
非常感谢您。
我通过在名为 "MOD_TURNUS" 的视图中添加另一列来解决它,该列有一个 case 语句
T_from_to as (
select
trunc(DATETIME_FROM) as d_from,
trunc(DATETIME_TILL) as d_to,
DATETIME_FROM as DATETIME_FROM,
DATETIME_TILL as DATETIME_TILL,
PK_ID,
TURNUS,
CASE WHEN TURNUS > 1 THEN 1 ELSE 0 END as MOD_TURNUS,
NAME_OF_GROUP,
FK_PUBLIC_FUNDING_BODY
FROM GROUPS
),
T_seq as (
select level-1 as delta
from dual
connect by level-1 <= (select max(d_to-d_from) from T_from_to)
)
select d_from + delta as DAY, PK_ID, TURNUS,
CASE WHEN TURNUS > 1 THEN 1 ELSE 0 END as MOD_TURNUS,
NAME_OF_GROUP, FK_PUBLIC_FUNDING_BODY, TO_CHAR(DATETIME_FROM,'HH.MI') as TIME_FROM,
TO_CHAR(DATETIME_TILL,'HH.MI') as TIME_TILL, DATETIME_FROM, DATETIME_TILL, d_from, d_to
from T_from_to, T_seq
where d_from + delta <= d_to
order by day
在我的前端查询中,我将 HAVING 语句更改为并将 MOD_TURNUS 添加到 Group 函数。
HAVING MOD(rownum,TURNUS) = MOD_TURNUS
...终于这么简单了