2012-05-08 3 views
1

Я создаю список рассылки людей, которые я отправить в типографию, чтобы быть распечатаны. Я выяснил, как вынимать все повторяющиеся адреса, но мне нужно, чтобы я мог изменить имя человека, который живет на дублированном адресе, в домашнее хозяйство «Фамилия». Дублированные адреса говорят мне, что у меня есть адрес для двух человек, которые живут там, поэтому вместо отправки им двух писем я отправляю их только один, адресованный им обоим. Заранее спасибоУдалить дубликаты строк, но изменить данные столбцов на остальные дублируют

Это то, что я до сих пор

SELECT First_Name + ' ' + Last_Name AS Name, Mail_Address_1, phone 
    FROM Personal 
    GROUP BY Mail_Address_1 
    HAVING COUNT(Mail_Address_1) > 1 
    order by Mail_Address_1 
+0

Так что вы хотите дубликаты? – Arion

+0

нет, мне нужно дубликаты вынимают и имя на оставшуюся строке, которая в Dups вынимает мне нужно изменить имя – user973671

+0

Что делать, если фамилии отличаются по тому же адресом? Не могли бы вы дать нам образец ввода и вывода? – user12861

ответ

0

Вы можете достичь этого, используя оконные функции ROW_NUMBER() и COUNT(*) OVER()

SELECT CASE WHEN Duplicates = 1 THEN First_Name + ForeName ELSE 'The ' + Last_name + ' Household' END [Name] 
     Mail_Address_1, 
     Phone 
FROM ( SELECT First_name, 
        Last_name, 
        Mail_Address_1, 
        Phone, 
        ROW_NUMBER() OVER(PARTITION BY Mail_Address_1 ORDER BY Last_name) [RowNum], 
        COUNT(*) OVER(PARTITION BY Mail_Address_1) [Duplicates] 
      FROM Personal 
      WHERE Registered_Voter = 1 
     ) p 
WHERE RowNum = 1 

ROW_NUMBER() ограничивает результаты к началу записи для каждого адреса, и определяет, какие COUNT логики для применения, то есть к человеку или к семье.

+0

мог бы я добавить в предложение where, например WHERE RowNum = 1 и registered_voter = 1? спасибо – user973671

+0

Да, но как бы вы это сделали, это будет зависеть от того, как это правило должно работать. т.е. если на одном адресе было 2 человека, Джон и Джейн Смит, но только Джон в качестве зарегистрированного избирателя должны пойти в Смит-Хозяйство, потому что там 2 человека, или он должен просто пойти к Джону Смиту, потому что он единственный зарегистрированный избиратель? – GarethD

+0

Да, если есть два совпадающие адреса и только один зарегистрированный избиратель между ними, названием не изменится и адрес с незарегестрированным избирателем не будет отображаться. Так что он должен проверить зарегистрированные избиратель первого – user973671

0

Если вы хотите взять из дублированных строк и изменить оставшиеся строки, чтобы определить его можно использовать T

WITH DUPE (MAIL_ADDRESS_1) 
AS 
(
    SELECT MAIL_ADDRESS_1 
     FROM PERSONAL 
     GROUP BY MAIL_ADDRESS_1 
     HAVING COUNT(MAIL_ADDRESS_1) > 1 
) 
SELECT FIRST_NAME, LAST_NAME , MAIL_ADDRESS_1, PHONE FROM PERSONAL WHERE MAIL_ADDRESS_1 NOT IN(
    SELECT MAIL_ADDRESS_1 FROM DUPE) 
UNION 
SELECT TOP 1 FIRST_NAME, LAST_NAME + '(DUPE MAIL)' AS LAST_NAME, MAIL_ADDRESS_1, PHONE 
FROM PERSONAL WHERE MAIL_ADDRESS_1 IN (SELECT MAIL_ADDRESS_1 FROM DUPE) 

или простой выберите:

SELECT FIRST_NAME, LAST_NAME , MAIL_ADDRESS_1, PHONE FROM PERSONAL WHERE MAIL_ADDRESS_1 NOT IN(
    SELECT MAIL_ADDRESS_1 
     FROM PERSONAL 
     GROUP BY MAIL_ADDRESS_1 
     HAVING COUNT(MAIL_ADDRESS_1) > 1 
    ) 
UNION 
SELECT TOP 1 FIRST_NAME, LAST_NAME + '(DUPE MAIL)' AS LAST_NAME, MAIL_ADDRESS_1, PHONE 
FROM PERSONAL WHERE MAIL_ADDRESS_1 IN (
    SELECT MAIL_ADDRESS_1 
     FROM PERSONAL 
     GROUP BY MAIL_ADDRESS_1 
     HAVING COUNT(MAIL_ADDRESS_1) > 1 
    ) 
ORDER BY MAIL_ADDRESS_1 
+0

Это не будет работать неправильно. «TOP 1» ограничивает вторую часть «UNION» всего лишь 1 результатом, а не только одним результатом для каждого почтового адреса. – GarethD

+0

Да, мое плохое! извините –

 Смежные вопросы

  • Нет связанных вопросов^_^