Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Тр.помощь прорядить таблицу (UPDATE через SELECT + DELETE)  [new]
f50
Member

Откуда: Россия
Сообщений: 456
Здравствуйте коллеги!
Такую задачу могу сделать только через курсор, что и сделал, а можно проще сделать (UPDATE через SELECT + DELETE)?
--что есть
DECLARE @t TABLE (id int, cod int, v int)
INSERT INTO @t VALUES (1001,1,50)
INSERT INTO @t VALUES (1002,1,50)
INSERT INTO @t VALUES (1003,2,70)
INSERT INTO @t VALUES (1004,2,50)
INSERT INTO @t VALUES (1005,3,90)
INSERT INTO @t VALUES (1006,3,50)
INSERT INTO @t VALUES (1007,4,120)
INSERT INTO @t VALUES (1008,4,50)
SELECT * FROM @t
--что бы хотелось получить в результате: сумма колонки V, и лишние строки (1002, 1004...) удалить.
DECLARE @t2 TABLE (id int, cod int, v int)
INSERT INTO @t2 VALUES (1001,1,100)
INSERT INTO @t2 VALUES (1003,2,120)
INSERT INTO @t2 VALUES (1005,3,140)
INSERT INTO @t2 VALUES (1007,4,170)
SELECT * FROM @t2
6 ноя 14, 10:51    [16804859]     Ответить | Цитировать Сообщить модератору
 Re: Тр.помощь прорядить таблицу (UPDATE через SELECT + DELETE)  [new]
Glory
Member

Откуда:
Сообщений: 104751
f50
--что бы хотелось получить в результате: сумма колонки V, и лишние строки (1002, 1004...) удалить.

Невозможно одной командой изменить и удалить записи
6 ноя 14, 10:53    [16804876]     Ответить | Цитировать Сообщить модератору
 Re: Тр.помощь прорядить таблицу (UPDATE через SELECT + DELETE)  [new]
invm
Member

Откуда: Москва
Сообщений: 9833
with s as
(
 select
  min(id) as id, cod, sum(v) as v
 from
  @t
 group by
  cod
)
merge into @t t
using s on s.id = t.id
when matched then
 update set v = s.v
when not matched by source then
 delete;
6 ноя 14, 11:04    [16804942]     Ответить | Цитировать Сообщить модератору
 Re: Тр.помощь прорядить таблицу (UPDATE через SELECT + DELETE)  [new]
Glory
Member

Откуда:
Сообщений: 104751
Был неправ

DECLARE @t TABLE (id int, cod int, v int)
INSERT INTO @t VALUES (1001,1,50)
INSERT INTO @t VALUES (1002,1,50)
INSERT INTO @t VALUES (1003,2,70)
INSERT INTO @t VALUES (1004,2,50)
INSERT INTO @t VALUES (1005,3,90)
INSERT INTO @t VALUES (1006,3,50)
INSERT INTO @t VALUES (1007,4,120)
INSERT INTO @t VALUES (1008,4,50)

SELECT min(id), cod, sum(v) as new_v FROM @t group by cod

MERGE @t AS target
USING (SELECT min(id) new_id, cod as new_cod, sum(v) as new_v FROM @t group by cod) AS source (new_id, new_cod, new_v)
ON (target.id = source.new_id and target.cod = source.new_cod)
WHEN NOT MATCHED BY SOURCE THEN 
	DELETE
WHEN MATCHED THEN
	UPDATE SET v = Source.new_v;


select * from @t
6 ноя 14, 11:11    [16804974]     Ответить | Цитировать Сообщить модератору
 Re: Тр.помощь прорядить таблицу (UPDATE через SELECT + DELETE)  [new]
f50
Member

Откуда: Россия
Сообщений: 456
Ох, вот это код! Спасибо ГУРУ SQL'я!
6 ноя 14, 11:14    [16804991]     Ответить | Цитировать Сообщить модератору
 Re: Тр.помощь прорядить таблицу (UPDATE через SELECT + DELETE)  [new]
Ice_and_Fire
Guest
Ну и как вариант
 SELECT 
  min(id) as id, cod, sum(v) as v INTO #t2
 from
  @t
 group by
  cod
  DELETE @t INSERT @t SELECT * FROM #t2     
    
SELECT * FROM @t
6 ноя 14, 15:01    [16806581]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить