1

我有以下查询:

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

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

4

2 回答 2

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')

对比

sum(case when fp.result = 'G' 
    and  to_date(fp.offered_date) >=  :ad_startdate

在一种情况下,您是 TO_DATE'ing ad_startdate 但不是另一种(所以它是否已经是一个日期?)。您也在 TO_DATE 列,但至关重要的是没有格式掩码。该列真的是 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
于 2012-11-06T08:22:55.617 回答
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。

于 2012-11-06T07:53:37.183 回答