Передача конкретной информации в группе в SQL Server - PullRequest
0 голосов
/ 07 сентября 2018

Я получил результаты после повторной проверки названия компании, например:

|customernumber|duplicate group |companyname|street   |telephone| 
|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    |         |

И я хочу этот результат:

|customernumber|duplicate group |companyname|street   |telephone| 
|1             |1               |ABC group  |Alpha 112|017887   |
|3             |1               |ABC group  |Alpha 112|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|016386   |
|5             |4               |JKL group  |DELTA 007|026386   |
|6             |4               |JKL group  |DELTA 007|026386   |

Правила:

  1. Добавить (только) номер дома, если есть запись с номером дома в той же группе дубликатов, к записи без номера дома (дубликат группы 1)

  2. Добавить номер телефона, если в записи с одной и той же дублирующейся группой есть одна запись с номером телефона, к записи без номера телефона (дублирующаяся группа 2)

  3. Добавить (только) номер дома И номер телефона, когда есть запись с номером дома И номером телефона в одной и той же повторяющейся группе, к записи без номера дома И номера телефона (дублирующаяся группа 3)

КОНКРЕТНЫЕ:

Иногда в дублирующейся группе более двух записей -> например, иногда у 2 есть (другой) номер дома и 1 нет или около того ... (Когда есть разные номера домов или / номера телефонов, не имеет значения, какой из них выбран для добавления)

Понятия не имею, как это решить; Я только нашел это, чтобы проверить, есть ли число внутри строки:

SELECT * 
FROM table 
WHERE Column LIKE '%[0-9]%'

Я благодарен за любую помощь!

1 Ответ

0 голосов
/ 07 сентября 2018

Вы можете использовать любой из следующих запросов в зависимости от версии 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;

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...