Можно ли принудительно установить диапазон дат в пределах SELECT с помощью Oracle? - PullRequest
0 голосов
/ 30 апреля 2020

Мне нужна ваша помощь с Oracle. Мне нужно сделать контрольный отчет, используя таблицу с именем restaurant_info Таблица выглядит следующим образом:

|------------------|---------------|
|     COMP_NAME    |      CODE     |
|------------------|---------------|
|     Pizza Co     |      PIC      |
|------------------|---------------|
|    So Asian      |      SOA      |
|------------------|---------------|

У меня есть другая таблица, которая называется restaurant_inc и возвращает доход ресторанов в конце в день.

|------------------|---------------|-----------------|
|        CODE      |   DATE_RES    |      INCOME     |
|------------------|---------------|-----------------|
|        PIC       |   14/04/2020  |      15908      |   
|------------------|---------------|-----------------|
|        PIC       |   15/04/2020  |      10890      |
|------------------|---------------|-----------------|
|        PIC       |   16/04/2020  |      10000      |
|------------------|---------------|-----------------|
|        PIC       |   17/04/2020  |      12890      |
|------------------|---------------|-----------------|
|        PIC       |   18/04/2020  |      13890      |
|------------------|---------------|-----------------|
|        PIC       |   20/04/2020  |      10880      |
|------------------|---------------|-----------------|
|        PIC       |   21/04/2020  |      9890       |
|------------------|---------------|-----------------|
|        PIC       |   22/04/2020  |       9500      |
|------------------|---------------|-----------------|

Как видно из таблицы, отображается доход ресторана, идентифицируемый по коду. То, что я хочу сделать, - это выполнить запрос с надписью COMP_NAME, CODE, который сообщает, отсутствует ли доход, с помощью оператора CASE. Результат выглядит следующим образом:

|------------------|---------------|---------------|---------------|
|     COMP_NAME    |      CODE     |   DATE_RES    |      CHECK    |
|------------------|---------------|---------------|---------------|
|     Pizza Co     |      PIC      |   14/04/2020  |               |
|------------------|---------------|---------------|---------------|
|     Pizza Co     |      PIC      |   15/04/2020  |               |
|------------------|---------------|---------------|---------------|
|     Pizza Co     |      PIC      |   16/04/2020  |               |
|------------------|---------------|---------------|---------------|
|     Pizza Co     |      PIC      |   17/04/2020  |               |
|------------------|---------------|---------------|---------------|
|     Pizza Co     |      PIC      |   18/04/2020  |               |
|------------------|---------------|---------------|---------------|
|     Pizza Co     |      PIC      |   19/04/2020  |    Missing    |
|------------------|---------------|---------------|---------------|
|     Pizza Co     |      PIC      |   20/04/2020  |               |
|------------------|---------------|---------------|---------------|
|     Pizza Co     |      PIC      |   21/04/2020  |               |
|------------------|---------------|---------------|---------------|
|     Pizza Co     |      PIC      |   22/04/2020  |               |
|------------------|---------------|---------------|---------------|
|    So Asian      |      SOA      |   14/04/2020  |    Missing    |
|------------------|---------------|---------------|---------------|
|    So Asian      |      SOA      |   15/04/2020  |    Missing    |
|------------------|---------------|---------------|---------------|
|    So Asian      |      SOA      |   16/04/2020  |    Missing    |
|------------------|---------------|---------------|---------------|
|    So Asian      |      SOA      |   17/04/2020  |    Missing    |
|------------------|---------------|---------------|---------------|
|    So Asian      |      SOA      |   18/04/2020  |    Missing    |
|------------------|---------------|---------------|---------------|
|    So Asian      |      SOA      |   20/04/2020  |    Missing    |
|------------------|---------------|---------------|---------------|
|    So Asian      |      SOA      |   21/04/2020  |    Missing    |
|------------------|---------------|---------------|---------------|
|    So Asian      |      SOA      |   22/04/2020  |    Missing    |
|------------------|---------------|---------------|---------------|

Как вы можете видеть в моем примере, значение CHECK для So Asia пусто, поскольку в таблице restaurant_inc нет строки, отображающей доход. Я не знаю, как добавить дату в мой запрос select и как обработать пропущенные значения в таблице restaurant_inc. В моем контрольном запросе мне нужно указать диапазон дат для столбца DATE_RES. Не могли бы вы помочь мне найти способ сделать этот контрольный запрос?

РЕДАКТИРОВАТЬ: Я пытался этот запрос:

SELECT inf.comp_name,inf.code,inc.date_res,case when 
(select income from restaurant_inc r where r.date_res=inc.date_res)
is null then 'Missing' end as CHECK FROM restaurant_info inf,
restaurant_inc inc where inf.code=inc.code and
inc.date_res>=to_date('14/04/2020','DD/MM/YYYY') 
and inc.date_res<=to_date('22/04/2020','DD/MM/YYYY')

Мой диапазон дат - между 14 апреля и 22 апреля. Не отображается «Отсутствует» для So Asia и Pizza Co. Я думаю, что это потому, что дата не в таблице restaurant_inc. Заранее благодарю за помощь.

1 Ответ

2 голосов
/ 30 апреля 2020

Диапазон дат, который вы хотите найти, на самом деле отсутствует ни в одной из ваших таблиц. Поэтому обычно я вижу, что это сделано, - создать новую таблицу, в которой будут храниться даты, по которым вы хотите выполнить поиск, и присоединить декартово / перекрестное к вашей базовой таблице.

-- set up sample data
with restaurant_info as (select 'Pizza Co' as comp_name, 'PIC' as code from dual union select 'So Asian', 'SO' from dual),
    restaurant_inc as (select 'PIC' as code,to_date('14/04/2020','dd/mm/yyyy') as date_res,15908 as income from dual union
                        select 'PIC',to_date('15/04/2020','dd/mm/yyyy'),10890 from dual union
                        select 'PIC',to_date('16/04/2020','dd/mm/yyyy'),10000 from dual union
                        select 'PIC',to_date('17/04/2020','dd/mm/yyyy'),12890 from dual union
                        select 'PIC',to_date('18/04/2020','dd/mm/yyyy'),13890 from dual union
                        select 'PIC',to_date('20/04/2020','dd/mm/yyyy'),10880 from dual union
                        select 'PIC',to_date('21/04/2020','dd/mm/yyyy'),9890  from dual union
                        select 'PIC',to_date('22/04/2020','dd/mm/yyyy'), 9500 from dual)
-- actual query
select r.comp_name, r.code, d.date_res, case when i.date_res is null then 'Missing' end as "Check"
from restaurant_info r
cross join (select date '2020-04-14' + level as date_res from dual 
    connect by level <= 8) d 
left join restaurant_inc i on r.code = i.code and i.date_res = d.date_res
order by 1, 3;

В этом случае я Я создаю встроенный вид (псевдоним d), который содержит дни с 04-14 до 04-22. Дайте мне знать, если что-то не имеет смысла.

...