Вы можете использовать любой из следующих запросов в зависимости от версии SQL Server. Идея состоит в том, чтобы использовать MAX
над строками, чтобы получить more completed
(более длинный), поскольку каждый символ больше, чем пустая строка при сравнении строк.
DECLARE @DataSource TABLE
(
[customernumber] INT
,[duplicate group] INT
,[companyname] VARCHAR(128)
,[street] VARCHAR(256)
,[telephone] VARCHAR(32)
);
INSERT INTO @DataSource ([customernumber], [duplicate group], [companyname], [street], [telephone])
VALUES (1, 1, 'ABC group', 'Alpha 112', '017887')
,(3, 1, 'ABC group', 'Alpha', '017887')
,(4, 2, 'DEF group', 'Beta 223', '034887')
,(7, 2, 'DEF group', 'Beta 112', '017555')
,(9, 3, 'GHI group', 'Gamma 007', '016386')
,(19, 3, 'GHI group', 'Gamma 007', '')
,(5, 4, 'JKL group', 'DELTA 007', '026386')
,(6, 4, 'JKL group', 'DELTA', '');
WITH DataSource AS
(
SELECT [duplicate group]
,MAX([street]) AS [street]
,MAX([telephone]) AS [telephone]
FROM @DataSource
GROUP BY [duplicate group]
)
SELECT DS.[customernumber]
,DS.[duplicate group]
,DS.[companyname]
,CASE WHEN DS.[street] NOT LIKE '%[0-9]%' THEN CTE.[street] ELSE DS.[street] END AS [street]
,CASE WHEN DS.[telephone] = '' THEN CTE.[telephone] ELSE DS.[telephone] END AS [telephone]
FROM @DataSource DS
INNER JOIN DataSource CTE
ON DS.[duplicate group] = CTE.[duplicate group];
SELECT [customernumber]
,[duplicate group]
,[companyname]
,IIF([street] NOT LIKE '%[0-9]%', MAX([street]) OVER(PARTITION BY [duplicate group]), [street]) AS [street]
,IIF([telephone] = '', MAX([telephone]) OVER(PARTITION BY [duplicate group]), [telephone]) AS [telephone]
FROM @DataSource;
