对于同一个表,由于在第二个查询中添加了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 :(得分:3)
如果a4
是日期列,则可能需要使时间元素无效。除了每个不同的时间,计数也各不相同。因此,我们需要指示数据库,仅考虑日期。
TO_CHAR(date,'RRRRMMDD')
或简称TRUNC(DATE_COLUMN)
即可。
答案 1 :(得分: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
1}}子句?)
答案 2 :(得分:0)
由于两个查询之间的区别在于,在第二个查询中,您要截断a4
abd a5
中的日期,列出差异的最简单方法应该是:
select *
from table1
where batchid = l_batchid
and a2 is not null
and (a4 > trunc(a4) or a5 > trunc(a5));