2016-12-09 11 views
-1

日付範囲内に一連の行を与えるOracle Apex関数があります。シーケンスで選択された項目は、TURNUSという識別子から起きています。ターン数が1であるクエリからすべての行が返される

日付範囲:examleについて01 - 11月 - 2016年30 - 11月 - 2016年に
トゥルヌスは次のとおりです。7
戻りは以下のとおりです。
01 - 11月 - 2016
07 - 11月 - 2016
14- 11月 - 2016
21 - 11月 - 2016
29 - 11月 - 2016

私は1にトゥルヌスを変更すると、私はのリターンを得る:
01 - 11月 - 2016

私は何を見たいのです:
01 - 11月 - 2016
02 - 11月 - 2016
...
30 - 11月 - 2016

私は、クエリを使用していた結果を受信するには私のデータベースで作成したビューからデータをピッキングしているOracle APEX Appのフロントエンドにあります。

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 
:フロントエンドで

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 
/

問合せ:私はビューを作成した。この後

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 
) 

データベースのテーブルがある:

のは、コンテンツのテーブルを見てみましょう

TURNUS = '1'以外の結果が正しく表示されています。 1行だけを返します。私は現在、TURNUSが '1'である場合、日付範囲内の任意の単一の行を返すシーケンスを取得するためのアイディアが不足しています。

私はいくつかのCASE文を考えて試しましたが、成功しませんでした。

は事前にありがとうございました。

+0

'持つROWNUM = 2-1'はあなたに1つの行を与え、' ROWNUM = 1 'と同じです...私はあなたが 'row_number()'をしたいと思う – JohnHC

+2

いくつかのサンプルデータと望みの結果を表示してください - あなたのスクリプトは読みにくいです - どうして集計関数なしでgroup byを使用しますか? Turnusの値は何ですか? rownumの望みの結果は何ですか?あなたのパズルに欠けているものがたくさんある... –

+0

私は真剣にあなたのコードを投稿したことに真剣に疑念を抱いています。また、 'VIEW'を二度使用しました。おそらく' VIEW'から選択したクエリと 'VIEW'自体の定義の中で一度選択します。ですから、*実際の*コードを投稿し、それを賢明な方法でフォーマットしようとしてください。 –

答えて

0

は私がする必要が文を変更し、私のフロントエンドのクエリでは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 

を持っている「MOD_TURNUS」と呼ばれる私のビューに別の列を追加することによってそれを解決し、グループ機能にMOD_TURNUSを追加しました。

HAVING MOD(rownum,TURNUS) = MOD_TURNUS 

...最終的にはそれほど単純で

0

私の側から少し試しました。これは私が得たものですが、私はここでも1月11日には行けません。これを確認すると、いくつか考えられます。私はあなたが日付だけを必要としていると考えています。

SELECT * 
FROM 
    (
    SELECT TRUNC(sysdate,'MM') + (level - 1) , 
    level AS lvl , 
    mod(level,:turnus) filter 
    FROM dual 
    CONNECT BY level <= last_day(sysdate) + 1 - TRUNC(sysdate,'MM') 
    ORDER BY level 
) 
WHERE filter = 0; 
関連する問題