Есть ли способ обновить существующую таблицу с помощью группы по сводке той же таблицы?

Примере:

Таблица А

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
Yosh Synergi 27 Окт 2015 в 12:44

4 ответа

Лучший ответ

Используйте select into #TempResult, обрежьте таблицу и заново вставьте значения из временного результата ...

0
Peter Schneider 27 Окт 2015 в 10:13

Без сохранения копии довольно сложно. Однако это возможно, но не может гарантировать производительность:

Это обновит все строки с новой суммой, а после этого удалит все строки, кроме 1 для каждого идентификатора в сочетании с годом даты.

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
0
t-clausen.dk 27 Окт 2015 в 10:21

Я думаю, вам следует вычислить SUM(data) GROUP BY ID, Year, вы можете использовать оконные функции (SQL Server 2005+), чтобы решить эту проблему, например:

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

Если ваша СУБД не поддерживает оконные функции, вы можете попробовать следующее:

SELECT DISTINCT
          SUM([data]) AS [data],
          ID, [Year]
FROM TableA
GROUP BY ID, [Year]
0
Nguyễn Hải Triều 27 Окт 2015 в 09:55

Если вы хотите truncate tableA и вставить новый набор результатов в таблицу A, затем сохранить новый набор результатов во временной таблице, усечь таблицу A и затем вставить данные из временной таблицы в таблицу A.

Запрос

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
Ullas 27 Окт 2015 в 10:14