编写SQL查询以查询和更新同一个表

时间:2015-12-22 09:26:52

标签: sql sql-server sql-server-2008

我对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

5 个答案:

答案 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