2016-12-09 7 views
-1

날짜 범위에서 일련의 행을 제공하는 Oracle Apex 함수가 있습니다. 시퀀스에서 선택한 항목은 TURNUS라는 식별자에서 발생합니다.턴어스가 1 인 쿼리에서 모든 행 반환

날짜 범위 : 7
반환은 다음과 같습니다 :
01 11 월 - 2016
07 11 월 - 2016
14 - 01 11 월 2016 11 월 2016 30
TURNUS가에 examle 들어 11월-2016
(21) 11 월 - 2016
29 11 월 - 2016

내가 1 TURNUS을 변경하는 경우, 나는의 반환받을 :
01 11 월 - 2016

내가보고 싶은 것은 :
01 11 월 - 2016
02 11 월 - 2016
...
30 11 월 - 2016 I 쿼리를 사용하고

결과를 수신하기 내 프런트 엔드 Oracle APEX 응용 프로그램에서 내 데이터베이스에서 만든보기에서 데이터를 선택합니다.

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'을 제외하고 결과가 올바르게 표시됩니다. 그냥 한 행을 반환합니다. 현재 TURNUS가 '1'일 때 날짜 범위에서 단일 행을 반환하는 시퀀스를 얻으려는 아이디어가 부족합니다.

몇 가지 CASE 문을 생각하고 시도했지만 성공하지 못했습니다.

대단히 감사합니다.

+0

'ROWNUM = 2-1'있는 것은 당신에게 하나 개의 행을주는'ROWNUM = 1 '과 동일합니다 ...나는 당신이'row_number()를 원한다고 생각한다. – JohnHC

+2

예제 데이터와 원하는 결과를 보여줘라. 스크립트는 읽기가 어렵다. 왜 집계 함수없이 group by를 사용 하는가? Turnus의 가치는 무엇입니까? rownum과 원하는 결과는 무엇입니까? 퍼즐에 많은 누락 된 부분이 있습니다. –

+0

나는 진짜 코드를 게시했는지 의심 스럽습니다. 처음에는 당신의 견해가 'VIEW'라고하지 않을 것입니다. 또한'VIEW'를 두 번 사용했습니다. 한 번만 'VIEW'에서 선택하는 쿼리에서 한 번, 'VIEW'자체에서 한 번 선택했습니다. 따라서 실제 * 코드를 게시하고 현명한 방법으로 형식을 지정하십시오. –

답변

0

이 난에 HAVING 문을 변경 내 프런트 엔드 쿼리에서 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;