我有以下查询:
select
fp.id,
fr.id,
sum(case
when to_date(fp.offered_date) BETWEEN TO_DATE( :ad_startdate, 'YYYY-MM-DD')
AND TO_DATE(:ad_enddate, 'YYYY-MM-DD') and fp.result <> 'E'
then 1
else 0
end) total,
sum(case when fp.result = 'G'
and to_date(fp.offered_date) >= :ad_startdate
and to_date(fp.offered_date) <= :ad_enddate then 1 else 0 end) colorgreen,
sum(case when fp.resultat = 'R'
and to_date(fp.offered_date) >= :ad_startdate
and to_date(fp.offered_date) <= :ad_enddate then 1 else 0 end) colorred
FROM
fruit_properties fp, fruit fr
WHERE
fp.id = fr.id
GROUP BY
fp.id, fr.id
我正在为每个总和列检查日期1次,并且有一种感觉这可以以某种方式制作吗?现在,如果我只在总列中检查一次,那么colorgreen + colorred可能会大于总数,因为无论它们具有什么日期,它都会计算。
可以以某种方式增强我的查询吗?
答案 0 :(得分:2)
例如你有:
when to_date(fp.offered_date) BETWEEN TO_DATE( :ad_startdate, 'YYYY-MM-DD')
AND TO_DATE(:ad_enddate, 'YYYY-MM-DD')
VS
sum(case when fp.result = 'G'
and to_date(fp.offered_date) >= :ad_startdate
在一个案例中,你是在ad_startdate,而不是另一个(那么它是否已经是日期?)。你也是TO_DATEing列,但关键是没有格式掩码。列真的是VARCHAR数据类型吗?如果是这样,你真的不应该把日期存储为DATE之外的任何东西。
无论如何,假设该列是DATE数据类型,并且绑定的类型为DATE ..
select fruit_prop_Id,fruit_id,
sum(case when result != 'E' then within_offer else 0 end) total,
sum(case when result = 'R' then within_offer else 0 end) colorred,
sum(case when result = 'G' then within_offer else 0 end) colorgreen
from (select fp.id fruit_id,
fr.id fruit_prop_Id,
fp.result,
case
when fp.offered_date >= :ad_startdate
and fp.offered_date <= :ad_enddate then 1 else 0 end within_offer
from fruit_properties fp, fruit fr
where fp.id = fr.id)
group by fruit_id, fruit_prop_Id
答案 1 :(得分:1)
您可以将日期检查放在where子句中:
select
fp.id,
fr.id,
sum(case when and fp.result <> 'E' then 1 else 0 end) total,
sum(case when fp.result = 'G' then 1 else 0 end) colorgreen,
sum(case when fp.resultat = 'R' then 1 else 0 end) colorred
FROM
fruit_properties fp, fruit fr
WHERE
fp.id = fr.id
AND to_date(fp.offered_date) >= :ad_startdate
AND to_date(fp.offered_date) <= :ad_enddate
GROUP BY
fp.id, fr.id
编辑:正如评论中所指出的,此查询将过滤掉在给定时间间隔内没有任何要约日期的ID。