我对SQL不是很友好所以我需要在表上编写SQL更新/删除查询。要求如下。
表A:
Col1(PK)Col2 Col3数量1 Code1 价值1 5
2 Code2 Value2 2
3代码1值1 3
4 CODE3值3 8
考虑上表,其中有多个行具有相同的Col2和Col3值。我想写一个查询,它将删除Col2和Col3的重复组合,并对结果记录的数量求和。
结果应该是这样的:
Col1(PK)Col2 Col3数量
1 Code1 价值1 8
2 Code2 Value2 2
4 CODE3值3 8
答案 0 :(得分:2)
使用此:
select *
from (select *, sum(Quantity) over (partition by col2,col3) as Quantity
from tableA
) t
答案 1 :(得分:2)
一个选项是将您想要的结果集SELECT
放入新表中,然后删除上一个表:
CREATE TABLE A_new(Col1 INT PRIMARY KEY,
Col2 varchar(255),
Col3 varchar(255),
Quantity INT);
INSERT INTO A_new (Col1, Col2, Col3, Quantity)
SELECT MIN(Col1) AS Col1, Col2, Col3, SUM(Quantity) AS Quantity
FROM A
GROUP BY Col2, Col3
接下来,您可以删除表格A
并将A_new
重命名为A
:
DROP TABLE A
sp_rename A_New, A
答案 2 :(得分:2)
您需要分两部分来完成,如果您想确保数据的完整性,这两部分应该包含在一个事务中。
第一部分更新所需的行' Quantity
,第二个删除现在重复的行。
BEGIN TRANSACTION
UPDATE TableA
SET Quantity=upd.Quantity
FROM TableA a
INNER JOIN (
SELECT MIN(Col1) AS Col1, SUM(Quantity) AS Quantity
FROM TableA
GROUP BY Col2, Col3
) upd
ON a.Col1 = upd.col1
;WITH DELETES
AS
(
SELECT Col1,ROW_NUMBER() OVER (PARTITION BY Col2,Col3 ORDER BY Col1) rn
FROM TableA
)
DELETE FROM TableA WHERE Col1 IN (
SELECT Col1 FROM DELETES WHERE rn>1
)
COMMIT TRANSACTION
实例:http://www.sqlfiddle.com/#!3/9efa9/7
(编辑:更新以修复评论中提到的问题)
答案 3 :(得分:1)
对于第一个更新步骤(假设表A的名称为Table_1):
Update Table_1 set Quantity = t.total
from Table_1 As p inner join
(select Min(Col1) as Col1,SUM(quantity) as total from Table_1 group by Col2,Col3) as t
on p.Col1=t.Col1
这将更新具有多个SUM数量的多行的每一行。
然后你可以删除其code2具有相同值的同一行:
WITH CTE AS(
SELECT
RN = ROW_NUMBER()OVER(PARTITION BY Col2,Col3 ORDER BY Col2,Col3)
FROM Table_1
)
DELETE FROM CTE WHERE RN > 1;
对不起,我以为Col2与Col3一样。 *我已经编辑了我的陈述。如果你有超过1行,它可以删除所有,除了第一行。
答案 4 :(得分:-1)
请执行以下查询:
SELECT
Col2,
Col3,
SUM(Quantity)
FROM table_1
GROUP BY
Col2,
Col3