一个日期检查整个查询

时间:2012-11-06 07:35:44

标签: sql oracle

我有以下查询:

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可能会大于总数,因为无论它们具有什么日期,它都会计算。

可以以某种方式增强我的查询吗?

2 个答案:

答案 0 :(得分:2)

你可以像这样简化。但请检查你的SQL。你正在混合TO_DATE和CHAR数据类型。这只会在灾难中结束。

例如你有:

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。