将删除的数据保留在子选择中以便随后插入

时间:2015-10-27 09:44:12

标签: sql-server sql-server-2008

是否有可能通过同一个表的摘要更新包含组的现有表?

示例:

表A

data (decimal(5,2)) | id (int) | year (date)

在表A中有许多记录,如

1.05 | 1 | 31.11.2015

10 | 1 | 31.11.2015
...

我现在想要group by ID & YEAR并且只在表A中有这些记录。

11.5 | 1 | 31.11.2015
...

有没有办法实现这一点,没有表A的副本?我可以将完整的结果集存储在变量中,然后截断表并插入表A中分组的新表吗?

4 个答案:

答案 0 :(得分:1)

如果要truncate tableA并将新结果集插入tableA,则将新结果集存储到临时表,截断tableA,然后将临时表中的数据插入tableA。

<强>查询

select sum(data) as data,
id,[year]
into #tbl
from tableA
group by id,[year];

truncate table tableA;

insert into tableA(data,id,[year])
select data,id,[year] from #tbl;

drop table #tbl;

select * from tableA;

答案 1 :(得分:0)

我认为您应该计算SUM(data) GROUP BY ID, Year,您可以使用Window functions(SQL Server 2005+)来解决此问题,如下所示:

SELECT DISTINCT
          SUM([data]) OVER(PARTITION BY ID, [Year]) AS [data],
          ID, [Year]
FROM TableA

如果您的DBMS不支持Window功能,您可以试试这个:

SELECT DISTINCT
          SUM([data]) AS [data],
          ID, [Year]
FROM TableA
GROUP BY ID, [Year]

答案 2 :(得分:0)

使用select into #TempResult,截断表格并重新插入临时结果中的值...

答案 3 :(得分:0)

不保留副本有点困难。但是,有可能无法保证性能:

这将使用新的总和更新所有行,然后删除除了1之外的所有行,每个id与日期的年份相结合。

DECLARE @t table(data decimal(5,2), id int, year date)

INSERT @t
values(1.05, 1, '20151130'),(10, 1, '20151130')

;WITH CTE as
(
  SELECT
    data, SUM(data) OVER (partition by id, year(year)) new_data
  FROM @t
)
UPDATE CTE SET data = new_data

;WITH CTE as
(
  SELECT row_number() OVER (partition by id, year(year) ORDER BY (SELECT 1)) rn
  FROM @t
)
DELETE CTE
WHERE rn > 1

SELECT * FROM @t