Я хочу, чтобы запрос объединял каждую из двух строк, удовлетворяющих следующим условиям в большой таблице:
Surname
Name
FatherName
1
2
3
4
Пример данных:
Surname Name FatherName Phone Mobile 1 2 3 4 Smith Alex Nick 12345 00000 xxx zzz --- --- Smith Alex Nick 12345 00000 --- --- vvv aaa Jone Mary John 22222 11111 sss eee --- --- Pan Peter Peter 33333 22222 ttt uuu --- --- Bob Nick Nick 44444 77777 --- --- ppp qqq Mary Maria John 99999 00000 jjj kkk --- --- Mary Maria John 99999 00000 --- --- iii ---
Ожидаемый результат:
Surname Name FatherName Phone Mobile 1 2 3 4 Smith Alex Nick 12345 00000 xxx zzz vvv aaa Jone Mary John 22222 11111 sss eee --- --- Pan Peter Peter 33333 22222 ttt uuu --- --- Bob Nick Nick 44444 77777 --- --- ppp qqq Mary Maria John 99999 00000 jjj kkk iii ---
Попробуйте этот простой запрос:
Select Surname, Name, FatherName, Phone, Mobile, Max(T.[1]) As [1], Max(T.[2]) As [2], Max(T.[3]) As [3], Max(T.[4]) As [4] From YourTable As T Group By Surname, Name, FatherName, Phone, Mobile
Это будет работать для ваших образцов данных.Сначала с самостоятельным соединением я получаю объединенные строки, а затем с помощью UNION ALL для уникальных строк:
SELECT t1.Surname, t1.Name, t1.FatherName, t1.Phone, t1.Mobile, t1.[1], t1.[2], t2.[3], t2.[4] FROM tablename t1 INNER JOIN tablename t2 ON t1.Surname = t2.Surname AND t1.Name = t2.Name AND t1.FatherName = t2.FatherName AND ( (t1.[1] <> '---' OR t1.[2] <> '---') AND (t1.[3] = '---' AND t1.[4] = '---') AND (t2.[3] <> '---' OR t2.[4] <> '---') AND (t2.[1] = '---' AND t2.[2] = '---') ) UNION ALL SELECT * FROM tablename AS t1 WHERE NOT EXISTS ( SELECT 1 FROM tablename AS t2 WHERE t1.Surname = t2.Surname AND t1.Name = t2.Name AND t1.FatherName = t2.FatherName AND t1.[1] <> t2.[1] )