2009-07-23 17 views
2

この最初のクエリは、特定の日付範囲のすべてのtransaction_detailsを取得します。 これは難しいですが、実際にはこのクエリで合計が必要な場合は合計が必要です。2つのクエリを組み合わせる

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は、私可換です。 e。 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 
    .... 
) 
関連する問題