Casper-SC
@Casper-SC
Программист (.NET)

Как слить строки в таблице в одну строку, у которых совпадают определённые столбцы?

Например, в таблице ниже есть данные, у которых совпадают столбцы ACC_ID и NAME. Мне нужно все такие записи слить в одну. В БД в моём случае их всегда 2, то есть по определённому ключу всегда выводятся не более 2 дубликатов, у которых отличается только IDENTITY столбец. Есть ещё другие записи, которые не имеют дубликатов. В моём примере примерно тоже самое. Ещё хотелось бы всё-аки не просто удалять дубликаты, а лучше именно сливать с них данные. Как это можно сделать?

IF OBJECT_ID('dbo.People') IS NULL
CREATE TABLE dbo.People (
  USER_ID INT NOT NULL
 ,ACC_ID INT NOT NULL
 ,NAME NVARCHAR(30) NOT NULL
 ,DEPARTMENT_ID INT NULL
 ,CONSTRAINT PK_People_USER_ID PRIMARY KEY CLUSTERED (USER_ID)
) ON [PRIMARY]
GO

INSERT INTO dbo.People(USER_ID, ACC_ID, NAME, DEPARTMENT_ID)
VALUES 
(1, 10, N'Владимир', 1),
(2, 10, N'Владимир', 1),
(3, 30, N'Александр', 2),
(4, 30, N'Александр', 2),
(5, 50, N'Юрий', 25),
(6, 50, N'Юрий', NULL),
(7, 60, N'Андрей', NULL),
(8, 60, N'Андрей', NULL);
GO


В итоге я хочу получить это:
(2, 10, N'Владимир', 1),
(4, 30, N'Александр', 2),
(6, 50, N'Юрий', 25),
(8, 60, N'Андрей', NULL);


UPDATE:
В таблице ещё есть строки не дубликаты. То есть, не каждая запись имеет пару, которую нужно или просто удалить или слить в одну.

Дубликаты я получаю так:
SELECT COUNT(*) AS [Count], ACC_ID, NAME 
  FROM People 
  GROUP BY ACC_ID, NAME 
  HAVING COUNT(*) > 1
  • Вопрос задан
  • 89 просмотров
Пригласить эксперта
Ответы на вопрос 1
tsklab
@tsklab Куратор тега Transact-SQL
Здесь отвечаю на вопросы.
в БД есть строки дубликаты, но их надо вычистить.
Сначала надо убрать "грязные" данные. Например,
(5, 50, N'Юрий', 25),
(6, 50, N'Юрий', NULL),

Он должен автоматом почистить БД

WHILE NOT (SELECT TOP (1) COUNT(ACC_ID) FROM People GROUP BY ACC_ID HAVING (COUNT(ACC_ID) > 1)) IS NULL  BEGIN
  DELETE FROM People 
    WHERE (USER_ID IN ( SELECT MAX(USER_ID) FROM People GROUP BY ACC_ID HAVING (COUNT(ACC_ID) > 1)))
END
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы