2017-02-08 10 views
-1

Для той же таблицы я получаю разные значения для обоих запросов, только из-за добавления функции to_char() во втором запросе. Как я могу определить, по какой записи я получаю разницу?Как получить различную запись при сравнении двух разных выдержек?

select count(1) from (select a1,a2,a4,a5, sum(a6), sum(a7),vap_code,vat_code from table1 
       WHERE batchid = l_batchid AND a2 IS NOT NULL 
       GROUP BY a1,a2,a4,a5,vap_code,vat_code HAVING sum(nvl(a6,0)+nvl(a7,0)) <> 0) 

Отсчет из приведенного выше запроса 8997.

select count(1) from (select a1,a2,to_char(a4,'RRRRMMDD'),to_char(a5,'RRRRMMDD'), sum(a6), sum(a7),vap_code,vat_code from table1 
       WHERE batchid = l_batchid AND a2 IS NOT NULL 
       GROUP BY a1,a2,to_char(a4,'RRRRMMDD'),to_char(a5,'RRRRMMDD'),vap_code,vat_code HAVING sum(nvl(a6,0)+nvl(a7,0)) <> 0) 

И для приведенного выше запроса счетчик равен 8996. Как я должен получить запись, создающее разницу здесь:

+0

Показать определение таблицы – Mihai

+0

a1 - varchar2 (100), a2 - varchar, a4- date, a5 - date, a6 - number, a7 - number и vap_code и vat_code - varchar – krishb591993

+0

Какой счет вы можете получить, если вы измените маску формата, используемую во втором запросе на 'RRRRMMDDHH24MISS', и если вы измените его на' SYYYYMMDD'? –

ответ

1

Слишком большой для комментария, но это возвращает данные:

select a1,a2,a4,a5, sum(a6), sum(a7),vap_code,vat_code 
from table1 
where batchid = l_batchid and a2 is not null 
group by a1,a2,a4,a5,vap_code,vat_code 
having sum(nvl(a6,0)+nvl(a7,0)) <> 0 
minus 
select a1, a2, to_date(a4, 'RRRRMMDD') a4, to_date(a5, 'RRRRMMDD') a5, suma6, suma7, vap_code, vat_code 
from (
    select a1,a2,to_char(a4,'RRRRMMDD') a4,to_char(a5,'RRRRMMDD') a5, sum(a6) suma6, sum(a7) suma7,vap_code,vat_code 
    from table1 
    where batchid = l_batchid and a2 is not null 
    group by a1,a2,to_char(a4,'RRRRMMDD'),to_char(a5,'RRRRMMDD'),vap_code,vat_code 
    having sum(nvl(a6,0)+nvl(a7,0)) <> 0 
); 

minus должен иметь тот же тип данных в каждой ветви, так что это принимает результат вашего второго запроса и преобразование введите даты в даты, чтобы сделать эту работу. Возможно, это все равно изменит все, что вызывает несоответствие, но подзапрос должен предотвратить это.

Если у вас нет дат со временем, кроме полуночи, и у меня нет негативных лет, я изо всех сил пытаюсь понять, в чем проблема. Если это идентифицирует строку с нарушением - если она существует, это может стать очевидным ...

(Кстати, что-то, что не повлияет на то, что вы видите, но не хотите использовать nvl() внутри sum() вызывает в вашем списке выбора, а не только в пункте having?)

+0

Да, у Алекса был рекорд, у него было другое время. Но я не понимаю, почему это не было раньше, когда я запускал простой запрос a4! = Trunc (a4). – krishb591993

+0

Кроме того, я использовал бы nvl() внутри вызовов sum(), но «вдохновитель», который написал этот код, не использовал. – krishb591993

+0

Было ли это a4 или a5, у которого было не полночное время? Может быть, вы только проверили один из столбцов раньше? Но вопрос, который я поставил в качестве комментария к ответу Махешванана или изменения вашего запроса, чтобы использовать маску даты с компонентами времени (комментарий по вопросу), должен был уже показать это. Странный. –

3

Если a4 - столбец даты, возможно, вам нужно свернуть элемент времени. Остальное для каждого другого времени, счет варьируется. Итак, нам нужно проинструктировать базу данных, чтобы рассмотреть только дату.

TO_CHAR(date,'RRRRMMDD') или просто TRUNC(DATE_COLUMN) сделают это.

+0

Время не считается – krishb591993

+0

Если a4 является столбцом даты, возможно, вам нужно свести значение элемента времени. вы можете объяснить, почему? –

+0

Вышеприведенный запрос является частью основного кода, для которого элемент времени уже был усечен, а элемент nls_element был установлен таким образом, что элемент времени был исключен. – krishb591993

0

Так как разница между двумя запросами, является то, что во втором вы усечение даты в a4 абде a5, самый простой способ перечислить различие должен быть :

select * 
from table1 
where batchid = l_batchid 
and a2 is not null 
and (a4 > trunc(a4) or a5 > trunc(a5));