#sql #oracle11g #oracle10g #oracle-apex #oracle-apex-5.1
Вопрос:
Мое имя таблицы-СЕАНСЫ. Мои поля для этой таблицы: SESSION_DATE (тип: дата), СЕАНСЫ.ЦЕНА (тип: Номер), СТАТУС (тип: Номер).
Я хочу, чтобы мой запрос показывал разные результаты в зависимости от текущего дня. если текущий день приходится на первые две недели месяца, покажите другие результаты, чем если бы он приходился на вторые две недели месяца.
Это мой вопрос:
select to_char(SESSION_DATE, 'YYYYMM') as CHARGE_MONTH,
to_char(SESSION_DATE, 'Month YY') as CHARGE,
sum(SESSIONS.PRICE) as PRICE
from SESSIONS SESSIONS
where SESSIONS.STATUS in (4,5)
and SESSIONS.SESSION_DATE between add_months(trunc(CURRENT_TIMESTAMP,'mm'),-13) and last_day(add_months(trunc(CURRENT_TIMESTAMP,'mm'),-1))
group by to_char(SESSION_DATE, 'YYYYMM'), to_char(SESSION_DATE, 'Month YY')
order by to_char(SESSION_DATE, 'YYYYMM') Desc
Если мы находимся в первые две недели текущего месяца, то
SESSIONS.SESSION_DATE between add_months(trunc(CURRENT_TIMESTAMP,'mm'),-13) and last_day(add_months(trunc(CURRENT_TIMESTAMP,'mm'),-1))
ещё
SESSIONS.SESSION_DATE between add_months(trunc(CURRENT_TIMESTAMP,'mm'),-13) and last_day(add_months(trunc(CURRENT_TIMESTAMP,'mm'),0))
Я пробовал что-то в этом роде:
select to_char(SESSION_DATE, 'YYYYMM') as CHARGE_MONTH,
to_char(SESSION_DATE, 'Month YY') as CHARGE,
sum(SESSIONS.PRICE) as PRICE
from SESSIONS SESSIONS
where SESSIONS.STATUS in (4,5)
and SESSION_DATE = case when to_char(current_timestamp, 'dd') < 15 then
between add_months(trunc(CURRENT_TIMESTAMP,'mm'),-13) and last_day(add_months(trunc(CURRENT_TIMESTAMP,'mm'),-1))
else
between add_months(trunc(CURRENT_TIMESTAMP,'mm'),-13) and last_day(add_months(trunc(CURRENT_TIMESTAMP,'mm'),0))
end
group by to_char(SESSION_DATE, 'YYYYMM'), to_char(SESSION_DATE, 'Month YY')
order by to_char(SESSION_DATE, 'YYYYMM') Desc;
но это не сработало:(ORA-00905: отсутствует ключевое слово)
Я пробовал и это, но все равно ничего:
select to_char(SESSION_DATE, 'YYYYMM') as CHARGE_MONTH,
to_char(SESSION_DATE, 'Month YY') as CHARGE,
sum(SESSIONS.PRICE) as PRICE
from SESSIONS SESSIONS
where SESSIONS.STATUS in (4,5)
and
case when extract(day from current_timestamp) from dual < 15 then
(SESSION_DATE between add_months(trunc(CURRENT_TIMESTAMP,'mm'),-13)
and last_day(add_months(trunc(CURRENT_TIMESTAMP,'mm'),-1)))
else
(SESSION_DATE between add_months(trunc(CURRENT_TIMESTAMP,'mm'),-13)
and last_day(add_months(trunc(CURRENT_TIMESTAMP,'mm'),0)))
end
group by to_char(SESSION_DATE, 'YYYYMM'), to_char(SESSION_DATE, 'Month YY')
order by to_char(SESSION_DATE, 'YYYYMM') Desc;
Я получаю эту ошибку:
ORA-20999: Не удалось проанализировать SQL-запрос! ORA-06550: строка 8, столбец 12: ORA-00907: отсутствует правая скобка
Ответ №1:
Вам не нужно case
выражение в where
предложении. Вы можете просто использовать обычные логические выражения:
select to_char(SESSION_DATE, 'YYYYMM') as CHARGE_MONTH,
to_char(SESSION_DATE, 'Month YY') as CHARGE,
sum(SESSIONS.PRICE) as PRICE
from SESSIONS SESSIONS
where SESSIONS.STATUS in (4, 5) and
( (extract(day from SESSIONS.SESSION_DATE) <= 14 and
SESSIONS.SESSION_DATE between add_months(trunc(CURRENT_TIMESTAMP, 'mm'), -13) and last_day(add_months(trunc(CURRENT_TIMESTAMP, 'mm'), -1))
) or
(extract(day from SESSIONS.SESSION_DATE) > 14) and
SESSIONS.SESSION_DATE between add_months(trunc(CURRENT_TIMESTAMP, 'mm'), -13) and last_day(add_months(trunc(CURRENT_TIMESTAMP, 'mm'), 0))
)
)
group by to_char(SESSION_DATE, 'YYYYMM'), to_char(SESSION_DATE, 'Month YY')
order by to_char(SESSION_DATE, 'YYYYMM') Desc;
Комментарии:
1. Спасибо Гордону Линоффу за потраченное время и ваш ответ! Я получаю эту ошибку: ORA-20999: Не удалось проанализировать SQL-запрос! ORA-06550: строка 6, столбец 44: ORA-00907: отсутствует правая скобка
2. @Apostolos . . . Я исправил опечатки.