случай оракула или расшифровка? - как справиться без рек - PullRequest
0 голосов
/ 20 июля 2011

Как я могу убедиться в этом утверждении, что если я получу now rows selected, я установлю, что мой результат = 1?Мне нужно значение 1, если у меня нет записей или счетчик 0. Я также хотел бы, чтобы нулевая дата была sysdate по умолчанию.

Вот то, что я имею до сих пор.Он работает с (sysdate-1), но когда я тестировал его с (sysdate-0) или =sysdate (сегодняшняя дата), я не получал никаких записей.Поэтому я хочу иметь возможность обрабатывать также и нулевые значения.

Как я могу изменить этот запрос, чтобы сделать это?или я бы использовал что-то вроде DECODE?

select 
     to_date(year||'/'||month||'/'||day, 'YYYY/MM/DD') as mydt,
     case when count(*) = 0 then 1 else 0 end result
from Table1 
where 
   to_date(year||'/'||month||'/'||day, 'YYYY/MM/DD') >= trunc(sysdate)-1
GROUP BY 
    to_date(year||'/'||month||'/'||day, 'YYYY/MM/DD')

Вот мой стол.Может быть, мне лучше вместо временной отметки?Существует также значение количества, которое может помочь изменить этот запрос или нет.Так что мне нужно получить значение 1 или 0 с отметкой времени, если это возможно.

SQL> desc Table1
 Name                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 YEAR                           NUMBER
 QUARTER                        NUMBER
 MONTH                          NUMBER
 DAY                            NUMBER
 HOUR                           NUMBER
 TIMESTAMP                      NUMBER
 CNT_N                              NUMBER
 ACTN_N                             NUMBER 
 ADDR_C                       VARCHAR2(255)

Ответы [ 4 ]

0 голосов
/ 25 апреля 2012

Может быть, вы можете инкапсулировать весь свой запрос в функции NVL следующим образом:

<code>
SELECT NVL(TO_CHAR((select to_date(year || '/' || month || '/' || day,
                                  'YYYY/MM/DD') as mydt
                     from Table1
                    where to_date(year || '/' || month || '/' || day,
                                  'YYYY/MM/DD') >= trunc(sysdate) - 1
                    GROUP BY to_date(year || '/' || month || '/' || day,
                                     'YYYY/MM/DD')),
                   'DD/MM/YYYY HH:MI:SS AM'),
           '1')
  FROM DUAL

Я удалил оператор запроса из запроса Вместо этого, что этот запрос будетЕсли ваш запрос возвращает какое-либо значение, он будет делать это без помех.Однако в случае, если запрос возвращает НИЧЕГО, тогда функция NVL вступит во владение и вернет 1. Я использовал функцию TO_CHAR, чтобы поддерживать тип данных обоих аргументов в функции NVL.И возвращаемая дата, и значение для NVL основаны на символах

Надеюсь, это поможет

0 голосов
/ 20 июля 2011

Я думаю, что вы можете изменить свой запрос, как показано ниже, чтобы присвоить sysdate нулевые значения

select
       nvl(to_date(year||'/'||month||'/'||day, 'YYYY/MM/DD') ,sysdate) as mydt
from Table1  
where
       nvl(to_date(year||'/'||month||'/'||day, 'YYYY/MM/DD') ,sysdate) 
                      >= trunc(sysdate)-1 
GROUP BY      nvl(to_date(year||'/'||month||'/'||day, 'YYYY/MM/DD') ,sysdate)

, но ваше второе требование не очень понятно ... уточните, что именно вы хотите с помощью count(*)

, если вы хотите присвоить 1 для нуля, то вы можете добавить следующую строку в выбранную статистику

case 
when nvl(to_date(year||'/'||month||'/'||day, 'YYYY/MM/DD') ,sysdate) = sysdate then
     1
else
count(*)-- or 0 ???!!!!!
0 голосов
/ 20 июля 2011

Похоже, вам нужно сгенерировать дату (ы), а затем посмотреть, как записи могут соответствовать каждой. Предполагая, что у вас нет данных в будущем, вы можете сделать что-то вроде:

select trunc(sysdate) + level - (:range + 1) as dt
from dual
connect by level <= (:range + 1);

который с: диапазон установлен в 1 дает две даты:

DT
---------
19-JUL-11
20-JUL-11

Затем вы можете получить внешнее присоединение к этому списку дат:

with tmp_dt as (
    select trunc(sysdate) + level - (:range + 1) as dt
    from dual
    connect by level <= (:range + 1)
)
select td.dt as mydt,
    case when count(t.year) = 0 then 1 else 0 end as result
from tmp_dt td
left join table1 t on t.year = extract(year from td.dt)
    and t.month = extract(month from td.dt)
    and t.day = extract(day from td.dt)
group by td.dt
order by td.dt;

Если у меня есть какие-либо данные в таблице только 19 июля-11, я получу:

MYDT          RESULT
--------- ----------
19-JUL-11          0
20-JUL-11          1

Если у вас есть данные в будущем, они не будут показаны; range - это сколько дней смотреть в прошлое. Если вы знаете, что есть предел, скажем, семь дней, вы можете использовать connect by level <= (:range + 1) + 7 или иметь вторую переменную, но это скорее зависит от того, что вы хотите увидеть.

Я немного поменял объединение, чтобы избежать преобразования даты для каждой строки таблицы, вместо этого извлекая соответствующую часть сгенерированной даты. Я надеюсь, что у вас есть причина хранить компоненты даты в отдельных полях, а не как date.


Если вы ищете только данные за сегодня, просто измените генератор даты:

with tmp_dt as (select trunc(sysdate) as dt from dual)
select td.dt as mydt,
     case when count(t.year) = 0 then 1 else 0 end result
from tmp_dt td
left join table1 t on t.year = extract(year from td.dt)
    and t.month = extract(month from td.dt)
    and t.day = extract(day from td.dt)
group by td.dt;

Если вы всегда хотите вчера, это будет select trunc(sysdate) - 1 as dt from dual и т. Д.

0 голосов
/ 20 июля 2011

Вы никогда не получите счет (*), равный нулю, с группой по.Если строк нет, вы не получите никаких групп, а если есть строки, то любая группа, которую вы получите, покажет количество строк.

Если у вас есть 3 строки на 1 января и еще 3 на 3 января, вы получите:

2011/01/01 3
2011/01/03 3

Вы не получите строки на 2 января.Вы хотите создать эту строку?Максимальное количество строк, которое вы хотите вернуть?

...