是否有可能通过同一个表的摘要更新包含组的现有表?
示例:
表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中分组的新表吗?
答案 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