Как обновить дублированные строки в одну строку - PullRequest
0 голосов
/ 05 января 2020

Мне нужно объединить одни и те же записи и строку суммы суммы по строке количества. Например:

glass type  height   width    quantity
---------------------------------------
4DC          1500     600        1
4DC          1500     600        2
4DC          1200     500        5
4DC          1200     500        2
3DC          1500     600        2

будет:

glass type   height   width   quantity
---------------------------------------
4DC           1500     600      3
4DC           1200     500      7
3DC           1500     600      2

Но мне не нужен какой-либо запрос выбора, мне нужно обновить таблицу и удалить дублирующиеся строки и обновить одну из них с суммой количество.

Как я могу это сделать?

Ответы [ 2 ]

2 голосов
/ 05 января 2020

Я рекомендую заменить таблицу:

select glasstype, height, width, sum(quantity) as quantity
into temp_t
from t
group by glasstype, height, width;

truncate table t;  -- backup first!

insert into temp_t (glasstype, height, width, quantity)
    select glasstype, height, width, quantity
    from temp_t;

drop table temp_t;

В качестве альтернативы, вы можете сделать это в два этапа:

with toupdate as (
      select t.*, sum(quantity) over (partition by glasstype, height, width) as new_quantity
      from t
     )
update toupdate
    set quantity = new_quantity;

with todelete as (
      select t.*,
             row_number() over (partition by glasstype, height, width order by glasstype) as seqnum
      from t
     )
delete from todelete
    where seqnum > 1;
1 голос
/ 05 января 2020

Я бы сделал то же самое, что и Гордон, но вместо этого я бы переименовал объекты:

SELECT GlassType,
       Height,
       Width,
       SUM(Quantity)
INTO dbo.NewTable
FROM dbo.YourTable
GROUP BY GlassType,
         Height,
         Width;
GO
EXEC sp_rename N'dbo.YourTable',N'OldTable';
GO
EXEC sp_rename N'dbo.NewTable',N'YourTable';
GO

Это означает, что у вас все еще есть копия вашей старой таблицы, которую вы не сможете на TRUNCATE, если у вас есть какие-либо внешние ключи. Тем не менее, вам придется воссоздать любые существующие ограничения и индексы для нового YourTable

. Затем я создам уникальное ограничение на вашей таблице, чтобы вы не могли получить дубликаты в будущем.

ALTER TABLE dbo.YourTable ADD CONSTRAINT UC_TypeHeightWidth UNIQUE (GlassType,Height,Width);
...