2

2 つのテーブルの差を合計したい状況があります。問題は、行が2番目のテーブルに存在する可能性があり、それを新しい行として挿入したいということです。

擬似

SELECT T1.seller, T1.code, T1.amount - T2.amount

説明は画像を見てください

リンク

4

4 に答える 4

2
 DECLARE @T1 TABLE(
    seller VARCHAR(10),
    code VARCHAR(3) NULL,
    amount MONEY
)

 DECLARE @T2 TABLE(
    seller VARCHAR(10),
    code VARCHAR(3) NULL,
    amount MONEY
)

INSERT INTO @T1 VALUES
('VL',NULL,1),
('VL','317',70005.6)

INSERT INTO @T2 VALUES
('VL',NULL,0.5),
('VL','500',4450)

SELECT seller,code,SUM(amount) [amount] FROM 
(
SELECT * FROM @T1
UNION ALL
SELECT seller,code,-amount as amount FROM @T2
) T
GROUP BY seller,code
于 2012-12-11T09:20:51.357 に答える
1

完全な外部結合を作成してから、合計する必要があります。内側のクエリのみを実行すると、可能な行の組み合わせ (t1 に排他的、t1 と t2 の両方に存在、t2 に排他的) が得られます。次に、それをグループ化して合計します。

SELECT  Seller ,
        Code ,
        SUM(Tab1_amt - Tab2_amt) AS Amount
FROM    ( SELECT    COALESCE(tab1.Seller, tab2.Seller) AS Seller ,
                    COALESCE(tab1.code, tab2.code) AS Code ,
                    COALESCE(tab1.amount, 0) AS tab1_amt ,
                    COALESCE(tab2.amount, 0) AS tab2_amt
          FROM      tab1
                    FULL OUTER JOIN tab2 ON tab1.seller = tab2.seller
                                            AND tab1.code = tab2.code
        ) AS Tbl
GROUP BY Seller ,
        Code

SQLFiddle のデモを見る

于 2012-12-11T09:13:13.250 に答える
1

が必要だと思いますFULL JOIN(実際に行を最初のテーブルに挿入したい場合を除く)

SELECT  COALESCE(t1.Seller, t2.Seller) AS Seller,
        COALESCE(t1.Code, t2.Code) AS Code,
        COALESCE(t1.Amount, 0) - COALESCE(t2.Amount, 0) AS Amount
FROM    Table1 t1
        FULL JOIN Table2 t2
            ON t1.Seller = t2.Seller
            AND COALESCE(t1.Code, 0) = COALESCE(t2.Code, 0);

テーブル 1 に行を挿入する必要がある場合は、2 つの操作を実行する必要があります。最初に挿入してから、次を選択します。

INSERT Table1 (Seller, Code, Amount)
SELECT  t2.Seller, t2.Code, 0 AS Amount
FROM    Table2 t2
WHERE   NOT EXISTS
        (   SELECT  1
            FROM    Table1 t1
            WHERE   t1.Seller = t2.Seller
            AND     COALESCE(t1.Code, 0) = COALESCE(t2.Code, 0)
        );

SELECT  t1.Seller, 
        t1.Code, 
        t1.Amount - COALESCE(t2.Amount, 0) AS Amount
FROM    Table1 t1
        LEFT JOIN Table2 t2
            ON t1.Seller = t2.Seller
            AND COALESCE(t1.Code, 0) = COALESCE(t2.Code, 0);

編集

各テーブルの IF 行は一意ではなく、それらを合計する必要がある場合は、JOIN によってクロス結合が導入されるため、サブクエリで合計を実行する必要があります。

このデータを検討してください

Table1
Seller  Code    Amount
VL      500     10
VL      500     20

Table2
Seller  Code    Amount
VL      500     30
VL      500     5

これに参加すると、次のものが得られます。

t1.Seller   t1.Code t1.Amount   t2.Seller   t2.Code t2.Amount
VL          500     10          VL          500     30
VL          500     10          VL          500     5
VL          500     20          VL          500     30
VL          500     20          VL          500     5

差の合計は、-5 ではなく -10 になります。

SELECT  COALESCE(t1.Seller, t2.Seller) AS Seller,
        COALESCE(t1.Code, t2.Code) AS Code,
        COALESCE(t1.Amount, 0) - COALESCE(t2.Amount, 0) AS Amount
FROM    (   SELECT  Seller, Code, SUM(Amount) AS Amount
            FROM    Table1 
            GROUP BY Seller, Code
        ) t1
        FULL JOIN 
        (   SELECT  Seller, Code, SUM(Amount) AS Amount
            FROM    Table2 
            GROUP BY Seller, Code
        ) t2
            ON t1.Seller = t2.Seller
            AND COALESCE(t1.Code, 0) = COALESCE(t2.Code, 0);

編集2

Daniel's answerUNIONメソッドは、FULL JOIN よりもはるかに優れたパフォーマンスを発揮します。

SELECT  Seller, Code, Amount = SUM(Amount)
FROM    (   SELECT  Seller, Code, Amount
            FROM    Table1
            UNION
            SELECT  Seller, Code, -Amount
            FROM    Table2
        ) t
GROUP BY Seller, Code
于 2012-12-11T09:13:48.883 に答える
1

このようなもの?「したがってtableX」に挿入するテーブルがわからない

insert into tableX (seller,code,amount) values (T1.seller, T1.code, T1.amount -T2.amount)
select count(*) from table2 having count(*) < 1

フィルターを挿入してフィルターを適用した後、フィルターをselectステートメントとして配置していることに注意してください。必要なSQLの種類を指定していないため、これが機能するかどうかはわかりません

于 2012-12-11T09:16:36.077 に答える