我有一種情況,我想總結兩個表之間的差異。問題是一行可能存在於第二個表中,然後我想將它作爲新行插入。從兩個表中總結插入如果不存在
僞
SELECT T1.seller, T1.code, T1.amount - T2.amount
看圖像做出解釋
我有一種情況,我想總結兩個表之間的差異。問題是一行可能存在於第二個表中,然後我想將它作爲新行插入。從兩個表中總結插入如果不存在
僞
SELECT T1.seller, T1.code, T1.amount - T2.amount
看圖像做出解釋
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
你需要做一個完全外部聯接 - 再總結一下。如果只運行內部查詢,您將獲得每個可能的行組合(不包括在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
我想你需要一個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 answer的UNION
方法比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
像這樣的事情?你不告訴插入到「因此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的什麼表,所以我不能說這是否工作
你正在使用哪些DBMS?你有什麼嘗試? –
'SELECT T1.seller,T1.code,(T1.amount - T2.amount)as T1mountSum from T1 inner T1 in T2.ID = T2.ID' – jjj
Im using SQL2008 SELECT T1.seller,T1.shortcutcode, (T1.amount - T2.amount)作爲totalamount FROM Table1 T1 內部連接Table2 T2 on T1.seller = T2。賣方 但這得到重複的行 – Gmorken