我有两个表TableA的和表B如下:如何使用Group By子句合并两个sql服务器表?
表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
我试过以下插入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
)
但它提供了以下错误。 请更正错误。我不知道这里会出现什么问题。
Msg 102,Level 15,State 1,Procedure PUR_PurchaseOrder_IU,Line 936 'MERGE'附近语法不正确。 Msg 156,Level 15,State 1,Procedure PUR_PurchaseOrder_IU,Line 953 关键字'AS'附近的语法不正确。
但是当我删除这些MERGE语句从我的存储过程,它执行...
+1好没有联盟 – 2012-01-06 07:21:47
请注意,费率不是总结 - 而是取最大值。请更正答案 – 2012-01-06 07:35:48
@OlegDok - 你说的对,thx。答案已更新。 – 2012-01-06 08:03:38