2009-07-23 104 views
2

第一个查询获取特定日期范围的所有transaction_details 尽管这很棘手,但实际上如果这有什么意义,我实际上需要这个查询中的总和。合并两个查询

SELECT td.transaction_id, 
    sum( IF(coalesce(ti.na, -1) = 0 
      AND coalesce(ti.special_info_type, -1) = 0 
      AND coalesce(ti.item_type, '') = 'P' 
      AND coalesce(ti.comp_id, 0) <= 0, 
      coalesce(disc_amt, 0), 
      0 
     ) 
    ) as disc_sum, 

    sum( IF(coalesce(ti.na, -1) = 0 
      AND coalesce(ti.special_info_type, -1) = 0 
      AND coalesce(ti.item_type, '') = 'P' 
      AND coalesce(ti.comp_id, 0) > 0, 
      coalesce(comp_amt, 0), 
      0 
     ) 
    ) as cSM, 

    sum( IF(coalesce(ti.na, -1) = 0 
      AND coalesce(ti.special_info_type, -1) = 0 
      AND coalesce(ti.item_type, '') = 'P' 
      AND coalesce(ti.comp_id, 0) > 0, 
      coalesce(comp_tax, 0), 
      0 
     ) 
    ) as cTX 

FROM transaction_details td 

LEFT OUTER JOIN transaction_items ti 
    ON ti.transaction_id = td.transaction_id 

WHERE td.na = 0 
    AND td.entry_TS >= ? 
    AND td.entry_TS < ? 

GROUP BY td.transaction_id; 

该查询在循环中针对从先前查询返回的每个事务执行。

SELECT count(x.id) as refCnt, 
    coalesce(sum(x.item_price + x.sub_price), 0) as refAmt, 
    coalesce(sum(x.efftax), 0) as refTax 

from(
    SELECT (tiP.item_price - tiP.comp_amt) as item_price, 
     coalesce(sum(tiA.item_price), 0) as sub_price, 
     (tiP.efftax - tiP.comp_tax) as efftax, 
     tiP.id 

    from transaction_items tiP 

    left outer join transaction_items tiA 
     on(tiP.id = tiA.ref_id 
      and tiA.item_type = 'A' 
      and tiA.na = 0 
     ) 

    where tiP.item_type = 'P' 
     and tiP.na = 0 
     and tiP.refund = 1 
     #and tiP.transaction_id = 

    group by tiP.id 
    order by tiP.transaction_id, tiP.order_id 
) as x; 

回答

1

首先,你可以移动COALESCE的进入查询。

NULL值没有贡献到SUM在你的逻辑,这就是为什么你可以提前进行筛选:

SELECT td.transaction_id, 
     SUM(IF(ti.comp_id < 0 OR ti.comp_id IS NULL, disc_amt, 0), 
     SUM(IF(ti.comp_id > 0, comp_amt, 0), 
     SUM(IF(ti.comp_id > 0, comp_tax, 0) 
FROM transaction_details td 
LEFT OUTER JOIN 
     transaction_items ti 
ON  ti.transaction_id = td.transaction_id 
WHERE td.entry_TS >= ? 
     AND td.entry_TS < ? 
     AND ti.na = 0 
     AND ti.special_info_type = 0 
     AND ti.item_type = 'P' 
GROUP BY 
     td.transaction_id; 

其次,SUM是可交换的,我。即SUMSUM是贡献值的SUM

您可以跳过计算中间值SUM的值。

0

试试这个:

SELECT td.transaction_id, SUM(disc_sum)+SUM(cSM)+SUM(cTX) 
FROM (
    SELECT SUM(...) As disc_sum, SUM(...) As cSM, SUM(...) As cTX 
    FROM transaction_details td 
    .... 
)