Sql 如果不存在,则插入两个表的总和

Sql 如果不存在,则插入两个表的总和,sql,sql-server-2008,sum,full-outer-join,Sql,Sql Server 2008,Sum,Full Outer Join,我有一种情况,我想求两个表之间的差的和。问题是第二个表中可能存在一行,然后我想将其作为新行插入 伪 SELECT T1.seller, T1.code, T1.amount - T2.amount 请看图片以了解解释 您需要进行一次完整的外部联接,然后进行汇总。如果您只运行内部查询,您将得到每个可能的行组合(在t1中是独占的,在t1和t2中都存在,在t2中是独占的)-然后将其分组并进行求和 SELECT Seller , Code , SUM(Tab1_amt

我有一种情况,我想求两个表之间的差的和。问题是第二个表中可能存在一行,然后我想将其作为新行插入

SELECT T1.seller, T1.code, T1.amount - T2.amount
请看图片以了解解释


您需要进行一次完整的外部联接,然后进行汇总。如果您只运行内部查询,您将得到每个可能的行组合(在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

请参见

我认为您需要一个
完全联接
(除非您确实希望将行插入到第一个表中)

如果确实需要将行插入表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);
编辑

如果每个表中的行不是unqiue,需要求和,则需要在子查询中求和,因为连接将引入交叉连接:

以这些数据为例

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
然后,差值之和为-10,而不是-5

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

中的
UNION
方法将比完全联接执行得更好:

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

像这样的?您没有告诉要插入到“因此tableX”中的表

在表X中插入(卖方、代码、金额)值(T1.seller、T1.code、T1.amount-T2.amount)
从表2中选择计数(*)小于1的计数(*)
请注意,在insert to apply filter之后,将筛选器作为select语句放置
您没有指定所需的sql类型,因此我无法说明这是否有效

您使用的是什么DBMS?您尝试过什么?
选择T1.seller,T1.code,(T1.amount-T2.amount)作为T1.ID=T2.ID上的T1内部连接T2的TAmountSum
Im使用SQL2008选择T1.seller,T1.shortcutcode,(T1.amount-T2.amount)作为T1.seller=T2.seller上的表1内部连接表2 T2的总金额,但这会得到重复的行
选择distinct T1.seller,T1.shortcutcode,(T1.amount-T2.amount)作为T1.seller=T2.seller上的表1 T1内部联接表2 T2中的总金额
表列是什么?
 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
insert into tableX (seller,code,amount) values (T1.seller, T1.code, T1.amount -T2.amount)
select count(*) from table2 having count(*) < 1
 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