【问题标题】:combining two queries结合两个查询
【发布时间】:2009-07-23 15:18:30
【问题描述】:

第一个查询获取特定日期范围的所有 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;

【问题讨论】:

    标签: sql subquery


    【解决方案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's。

    【讨论】:

      【解决方案2】:

      试试这个:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多