2012-12-11 42 views
2

我有一種情況,我想總結兩個表之間的差異。問題是一行可能存在於第二個表中,然後我想將它作爲新行插入。從兩個表中總結插入如果不存在

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

看圖像做出解釋

LINK

+0

你正在使用哪些DBMS?你有什麼嘗試? –

+0

'SELECT T1.seller,T1.code,(T1.amount - T2.amount)as T1mountSum from T1 inner T1 in T2.ID = T2.ID' – jjj

+0

Im using SQL2008 SELECT T1.seller,T1.shortcutcode, (T1.amount - T2.amount)作爲totalamount FROM Table1 T1 內部連接Table2 T2 on T1.seller = T2。賣方 但這得到重複的行 – Gmorken

回答

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 
+0

有時我們忘記了簡單的方法... – cairnz

+0

這是偉大的丹尼爾!謝謝大家。問題解決了 – Gmorken

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 Demo

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

編輯

如果在每個表中的行不unqiue,你需要總結他們,那麼你需要做的款項在子查詢的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 

差的總和,然後-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); 

EDIT 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 
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的什麼表,所以我不能說這是否工作

相關問題