我有两个表TableA和TableB,如下所示:
表A:
ItemID Qty Rate
-------- ----- --------
1 10 100.00
2 20 150.00
表B:
ItemID Qty Rate
-------- ----- -------
1 5 150.00
3 10 200.00
3 20 400.00
现在我想合并这两个表。我想要的结果需要如下:
结果表A:
ItemID Qty Rate
-------- ----- -------
1 15 150.00
2 20 150.00
3 30 400.00
我尝试了以下 Insert Select 语句,但它没有给出所需的结果。
INSERT INTO TableA
(
ItemID,
Qty,
Rate
)
SELECT
ItemID,
SUM(Qty),
MAX(Rate)
FROM
TableB
GROUP BY
ItemID
但它给出的结果如下:
ItemID Qty Rate
-------- ----- --------
1 10 100.00
2 20 150.00
1 5 150.00
3 30 400.00
如何达到我想要的结果?
我尝试过这样的:
MERGE PUR_PODetail AS Target
USING (
SELECT
@POID,
ItemID,
SUM(POQuantity),
MAX(UnitRate),
1,
CASE WHEN D1 = '' THEN NULL ELSE D1 END D1,
CASE WHEN D2 = '' THEN NULL ELSE D2 END D2,
CASE WHEN D3 = '' THEN NULL ELSE D3 END D3,
CASE WHEN RandomDimension = '' THEN NULL ELSE RandomDimension END RandomDimension,
0
FROM
@Detail
GROUP BY
ItemID, D1, D2, D3, RandomDimension
) AS Source ON (Target.ItemID = Source.ItemID) AND
(ISNULL(Target.D1, -999) = ISNULL(Source.D1, -999)) AND
(ISNULL(Target.D2, -999) = ISNULL(Source.D2, -999)) AND
(ISNULL(Target.D3, -999) = ISNULL(Source.D3, -999)) AND
(ISNULL(Target.RandomDimension, -999) = ISNULL(Source.RandomDimension, -999))
WHEN MATCHED
THEN UPDATE SET
Target.POQuantity = Target.POQuantity + Source.POQuantity,
Target.UnitRate = MAX(Source.UnitRate)
WHEN NOT MATCHED
INSERT
(
POID,
ItemID,
POQuantity,
UnitRate,
ItemStatusID,
D1,
D2,
D3,
RandomDimension,
EDInclusive_f
)
VALUES
(
@POID,
Source.ItemID,
Source.POQuantity,
Source.UnitRate,
1,
CASE WHEN Source.D1 = '' THEN NULL ELSE Source.D1 END D1,
CASE WHEN Source.D2 = '' THEN NULL ELSE Source.D2 END D2,
CASE WHEN Source.D3 = '' THEN NULL ELSE Source.D3 END D3,
CASE WHEN Source.RandomDimension = '' THEN NULL ELSE Source.RandomDimension END RandomDimension,
0
)
但它给出了以下错误。 请更正错误。我不知道这里会出现什么问题。
消息 102,级别 15,状态 1,过程 PUR_PurchaseOrder_IU,第 936 行 “MERGE”附近的语法不正确。 消息 156,级别 15,状态 1,过程 PUR_PurchaseOrder_IU,第 953 行 关键字“AS”附近的语法不正确。
但是当我从存储过程中删除这些合并语句时,它正在执行...
最佳答案
您不能仅使用 INSERT
语句来执行此操作,您必须使用 INSERT
或 UPDATE
,具体取决于已存在的 ItemID在您的目标表中。
SQL Server 2005
UPDATE @TableA
SET Qty = a.Qty + b.Qty
, Rate = CASE WHEN a.Rate < b.Rate
THEN b.Rate
ELSE a.Rate
END
FROM @TableA a
INNER JOIN (
SELECT ItemID
, Qty = SUM(Qty)
, Rate = MAX(Rate)
FROM @TableB
GROUP BY
ItemID
) b ON a.ItemID = b.ItemID
INSERT INTO @TableA
SELECT ItemID, Qty, Rate
FROM ( SELECT ItemID
, Qty = SUM(Qty)
, Rate = MAX(Rate)
FROM @TableB b
WHERE NOT EXISTS (SELECT * FROM @TableA a WHERE a.ItemID = b.ItemID)
GROUP BY
ItemID
) b
SQL Server 2008 提供 MERGE对此的声明。
Performs insert, update, or delete operations on a target table based on the results of a join with a source table. For example, you can synchronize two tables by inserting, updating, or deleting rows in one table based on differences found in the other table.
SQL Server 2008
MERGE @TableA AS Target
USING (
SELECT ItemID
, Qty = SUM(Qty)
, Rate = MAX(Rate)
FROM @TableB
GROUP BY
ItemID
) AS source (ItemID, Qty, Rate) ON (target.ItemID = source.ItemID)
WHEN MATCHED THEN
UPDATE SET target.Qty = target.Qty + source.Qty
, target.Rate = CASE WHEN target.Rate < source.Rate
THEN source.Rate
ELSE target.Rate
END
WHEN NOT MATCHED THEN
INSERT (ItemID, Qty, Rate)
VALUES (source.ItemID, source.Qty, source.Rate);
关于sql - 如何使用Group By子句合并两个sql server表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8754564/