Проверка значения в нескольких столбцах для данной группы

я не уверен, как это получить в SQL 2008

Для одного и того же почтового кода есть несколько клиентов и есть RelationNo, и я пытаюсь найти отсутствующий номер Relation, когда один и тот же почтовый код имеет два или более номера клиента, и любой номер телефона этого клиента одинаковый, тогда тот же номер сделки будет обновлен там, где он отсутствует или NULL или Blank

ЕСЛИ НОМЕР ТЕЛЕФОНА НЕ ПРИСУТСТВУЕТ НЕТ ДЕЙСТВИЙ.

кто-нибудь может предложить, как это сделать в sql

Таблица:

DECLARE @MASTER TABLE ( POSTAL VARCHAR (50), CLIENT VARCHAR (50), phone1 INT, phone2 INT, RelationNo VARCHAR (50) ) INSERT @MASTER SELECT 'M169HE', 'E5017766',016187,88888,'E100' UNION ALL SELECT 'M169HE', 'M0111136', '', 016187, '' UNION ALL SELECT 'IV11UF', 'E3009949', 50505, '', 'F200' UNION ALL SELECT 'KA48HH', 'E3087713', 01290, '', '' UNION ALL SELECT 'KA48HH', 'E3017126', 55665, 01290, 'G999' UNION ALL SELECT 'KA48HH', 'E5005326', '', 55665, '' UNION ALL SELECT 'YO72LZ', 'C5640095', '', '', 'T8888' UNION ALL SELECT 'YO72LZ', 'C5640096', '', '', '' 

Вывод:

 POSTAL| CLIENT |phone1 | phone2| RelationNo M169HE| E5017766|16187 |88888 |E100 M169HE| M0111136| |16187 |E100 IV11UF| E3009949| 50505| |F200 KA48HH| E3087713| 1290 | |G999 KA48HH| E3017126| 55665|1290 |G999 KA48HH| E5005326| |55665 |G999 YO72LZ| C5640095| | T8888 | YO72LZ| C5640096| | | 

благодаря

Использование cross apply внутри common table expression для поиска и обновления соответствующего RelationNo для тех пропущенных строк RelationNo :

установка теста: http://rextester.com/YARZ79913

 ;with cte as ( select o.*, x.FoundRelationNo from @MASTER as o cross apply ( select top 1 FoundRelationNo = i.RelationNo from @MASTER as i where i.Postal = o.Postal and nullif(i.relationno,'') is not null and ( nullif(i.phone1,0) in (o.phone1, o.phone2) or nullif(i.phone2,0) in (o.phone1, o.phone2) ) ) as x where nullif(o.relationno,'') is null and (o.phone1 > 0 or o.phone2 > 0) ) --select * from cte update cte set RelationNo = FoundRelationNo select * from @MASTER 

Результаты:

 +--------+----------+--------+--------+------------+ | POSTAL | CLIENT | phone1 | phone2 | RelationNo | +--------+----------+--------+--------+------------+ | M169HE | E5017766 | 16187 | 88888 | E100 | | M169HE | M0111136 | 0 | 16187 | E100 | | IV11UF | E3009949 | 50505 | 0 | F200 | | KA48HH | E3087713 | 1290 | 0 | G999 | | KA48HH | E3017126 | 55665 | 1290 | G999 | | KA48HH | E5005326 | 0 | 55665 | G999 | | YO72LZ | C5640095 | 0 | 0 | T8888 | | YO72LZ | C5640096 | 0 | 0 | | +--------+----------+--------+--------+------------+ 

Это можно сделать с помощью простого apply и union all :

 DECLARE @t TABLE(POSTAL VARCHAR (50), CLIENT VARCHAR (50), phone1 INT, phone2 INT, RelationNo VARCHAR (50) ) INSERT @t SELECT 'M169HE', 'E5017766',016187,88888,'E100' UNION ALL SELECT 'M169HE', 'M0111136', '', 016187, '' UNION ALL SELECT 'IV11UF', 'E3009949', 50505, '', 'F200' UNION ALL SELECT 'KA48HH', 'E3087713', 01290, '', '' UNION ALL SELECT 'KA48HH', 'E8888888', 01290, '', 'G888' UNION ALL SELECT 'KA48HH', 'E3017126', 55665, 01290, 'G999' UNION ALL SELECT 'KA48HH', 'E5005326', '', 55665, '' UNION ALL SELECT 'YO72LZ', 'C5640095', '', '', 'T8888' UNION ALL SELECT 'YO72LZ', 'C5640096', '', '', '' select t.POSTAL ,t.CLIENT ,t.phone1 ,t.phone2 ,tt.RelationNo from @tt outer apply(select top 1 RelationNo from @t t2 where t.POSTAL = t2.POSTAL and t.CLIENT <> t2.CLIENT and (nullif(t.phone1,0) in(t2.phone1,t2.phone2) or nullif(t.phone2,0) in(t2.phone1,t2.phone2) ) and t2.RelationNo <> '' ) tt where t.RelationNo = '' union all select * from @t where RelationNo <> '' order by 1; 

Вывод:

 +--------+----------+--------+--------+------------+ | POSTAL | CLIENT | phone1 | phone2 | RelationNo | +--------+----------+--------+--------+------------+ | IV11UF | E3009949 | 50505 | 0 | F200 | | KA48HH | E8888888 | 1290 | 0 | G888 | | KA48HH | E3017126 | 55665 | 1290 | G999 | | KA48HH | E3087713 | 1290 | 0 | G888 | | KA48HH | E5005326 | 0 | 55665 | G999 | | M169HE | M0111136 | 0 | 16187 | E100 | | M169HE | E5017766 | 16187 | 88888 | E100 | | YO72LZ | C5640096 | 0 | 0 | NULL | | YO72LZ | C5640095 | 0 | 0 | T8888 | +--------+----------+--------+--------+------------+ 
Interesting Posts

Откат транзакции с использованием журнала транзакций

Почему мой внешний ключ имеет значение NULL при вставке значений

Резервное копирование закладок SQL Server

Поддерживает ли SQL Server 2012 транзакционную репликацию с обновляемой подпиской?

Msgstr "Невозможно открыть базу данных по умолчанию пользователя. Ошибка входа. "После установки SQL Server Management Studio Express

MSSQL Trigger для обновления работает только один раз

Как заставить SQL Server Management Studio прекратить обработку ошибки?

Невозможно записать данные на транспорт. Vs2017 ASP.net core Scaffolding (MSSQL WINDOW 10)

Задача CLD SQL Server UDF

Обновление переменной в пользовательском компоненте SSIS не является постоянным при завершении процесса

Как запретить пустые строки в столбце NVARCHAR

Использование функции в выражении Select для преобразования

Как я могу напрямую добавить данные из таблицы DataTable в таблицу базы данных?

JOIN запрос для извлечения нескольких столбцов, ссылающихся на один столбец из другой таблицы

SQL Server 2008 как база данных XML-документа

Давайте будем гением компьютера.