0

これが私のテーブルのスクリーンショットです

ここに画像の説明を入力してください

sales_contract_nbrnameでグループ化すると、 PostAmtの合計が0になるすべての行を削除しようとしています。

例えば ​​:

sales_contract_nbr 51101008103は、名前でグループ化すると削除され、sales_contract_nbrは合計が0になると-96.83および96.83として削除されます。

非常に単純ですよね?

しかし、これとは別に、グループ内の契約を削除したいということです。つまり、契約51101008195がグループ化されている場合、それは533.87になり、削除されません(強調表示されます)。

でもグループで削除したい

たとえば、契約番号51101008195の2つの行を最初に合計する必要があります(下の画像を参照) 。つまり、合計0を取得するには、金額-533.87533.87を合計する必要があります。契約のレコードは1つだけ残しておく必要があります。

ここに画像の説明を入力してください

アップデート

詳細説明:

ここに画像の説明を入力してください

私がやりたいのは、最初に行番号1と2をグループ化し(1つは正、もう1つは負の量を一致させる)、次に他の行をグループ化することです。同じ契約番号の行が4つある場合は、行1と行2をグループ化する必要があります。絶対量が同じであれば、行番号3と4が削除されない場合は、行3と行4をグループ化する必要があります。 。

ここに画像の説明を入力してください

group byを使用して、合計が0になり、同じ名前または契約番号を持つ行を削除したいと思います。

質問を明確にしたと思います。そうでない場合はお問い合わせください。

どのようにそれを行うことができますか?

私が今までやっているのは:

SELECT sales_contract_nbr
,name
,SUM(PostAmt) PostAmt
FROM tblMasData 
GROUP BY sales_contract_nbr, name

ありがとう。

4

1 に答える 1

1

これが私が今思いついたものです:

SELECT location
    ,sales_contract_nbr
    ,name
    ,SUM(absPostAmt * nbPostAmt) / ABS(SUM(nbPostAmt)) PostAmt
    ,ABS(SUM(nbPostAmt)) nbPostAmt
    ,SUM(absPostAmt * nbPostAmt) PostAmtTotal
FROM ( 
    SELECT location
        ,sales_contract_nbr
        ,name
        ,PostAmt
        ,ABS(PostAmt) absPostAmt
        ,SUM(CASE WHEN PostAmt >= 0 THEN 1 ELSE -1 END) nbPostAmt
    FROM tblMasData 
    GROUP BY location
        ,sales_contract_nbr
        ,name
        ,PostAmt
        ,ABS(PostAmt)
) t
GROUP BY location
    ,sales_contract_nbr
    ,name
    ,absPostAmt
HAVING SUM(absPostAmt * nbPostAmt) != 0

SQLFiddleを参照してください。

これはあなたの質問に完全に答えるものではありません。たとえば、100 + 100-200の場合、3つの行すべてが非表示になるわけではありません。しかし、一連の行の中から0に等しい組み合わせを見つけるのはかなり厄介な場合があります。

さらに、一部の行の量が同じである場合、それらはグループ化されます。そのため、これらの行が等しいことをカウントする列を追加し、最後にそれらを合計する列を追加しました。

これにより、少なくともプログラムでデータを処理できるようになります。

これでニーズが満たされるかどうか、または改善が必要かどうかをお知らせください(SQLがあまりきれいではない場合があります)。

于 2013-02-26T12:58:57.987 に答える