-1

OpenERP のクライアントの 1 つに問題があります。私は彼らのためにカスタムオブジェクトを構築する必要があります。なぜなら、販売後に返品されることがあるという問題があるからです。そのため、これをマイナスとしてマークし、以前の販売合計から差し引く必要があります。

SELECT sum(rsm1.product_qty_out) as "out"
     , sum(rsm2.product_qty_in) as "in"
     , rsm2.location_id
     , rsm2.product_id
     , rsm2.month
from report_stock_move as rsm1, report_stock_move as rsm2
where rsm2.location_id in (
    select id
    from stock_location
    where "name" = 'Consumers'
    )
and rsm1.location_id not in (
    select id
    from stock_location
    where "name" = 'Consumers'
    )
and rsm1.location_dest_id = rsm2.location_id
and rsm2.location_dest_id = rsm1.location_id
and rsm1.state = 'done' -- both are in done state
and rsm2.state = rsm1.state
group by rsm2.location_id, rsm2.month, rsm2.product_id
;

誰にもアイデアはありますか?また、グループ化に使用するテーブルに応じて、さまざまな結果が得られます。何故ですか?

編集 申し訳ありませんが、これを解決するために急いで、私は自分の主張を明確にしたようです。stock_location テーブルの Consumers の location_id を持つ report_stock_moves は負である必要があり、別の場所の location_id を持つ report_stock_moves に合計する必要がありますが、Consumer は location_dest_id です。

例:

location_id = Some Place (actually ID of stock_location of course)
product_qty = 8
location_dest_id Consumers
date = 2012-07-02

location_id = Consumer
product_qty = 4
location_dest_id Some Place
date = 2012-07-04

レコードの例を 2 つ示します。それらには異なる日付が添付されているため、それらを結合またはグループ化したい場合は、おそらく最大日付、または返品の日付(消費者からある場所へ)を取得して、それらをまとめたときに、iそれらをまとめずに消費者に何が入っているかだけを見て、8 と言う代わりに 4 を取得します。

4

1 に答える 1

1

誰かが後でこれに苦労した場合に備えて。ここに私の答えを貼り付けます。ここでユニオンオールが機能しているように見える理由について誰かが説明するのを手伝ってくれるなら、私はすべて耳を傾けます. 私は単純な SQL を実行できますが、特にこのような場合に、ユニオンがどのように機能するかについてはあまり知りません。

select max(total.id) as id,
                     sum(total.product_qty) as product_qty,
                     total.location_id as location_id,
                     total.date as "date",
                     total.year as year,
                     total.month as month,
                     total.day as day,
                     total.product_id as product_id
                     from (
                       -- From Consumer back to location
                        select -max(id) as id,
                        -sum(product_qty) as product_qty, 
                        location_dest_id as location_id, 
                        "date", year, month, day, product_id
                        from report_stock_move
                        where location_id in (
                            select id
                            from stock_location
                            where "name" = 'Consumers'
                        )
                        and "state" = 'done'
                        group by location_dest_id, "date", year, month, day, product_id

                        union all

                        -- From Location to Consumer
                        select max(id) as id,
                        sum(product_qty) as product_qty, 
                        location_id, "date", year, month, day, product_id
                        from report_stock_move
                        where location_id not in (
                            select id
                            from stock_location
                            where "name" = 'Consumers'
                        )
                        and "state" = 'done'
                        and location_dest_id in (
                            select id
                            from stock_location
                            where "name" = 'Consumers'
                        )
                        group by location_id, "date", year, month, day, product_id
                     ) as total
                     group by location_id, "date", year, month, day, product_id
于 2012-07-19T02:19:02.017 に答える