2016-05-08 16 views
0

Ich habe eine Tabelle mit 4 Spalten und 7 Zeilen.Nur eindeutige Zeilen aus einer Tabelle zurückgeben

this is my table sample

Diese Tabelle enthält 1 Kunden mit der gleichen ID gleichen LNAME und FNAME.

Auch die Tabelle hat 2 Kunden mit der gleichen ID, aber unterschiedliche LNAME oder FNAME.

Das ist der Verkaufsreplikationseingabefehler. Im Idealfall meine Tabelle sollte nur zwei Zeilen (Zeile mit ID_pk 3 und 7)

haben [! [UNIQUE KUNDEN] [3]] [3]

enter image description here

Ich brauche die folgenden result- haben Sets aus der obigen Tabelle:

  1. Alle eindeutigen Zeilen durch den alle vier Spalten (Zeile mit ID_pk 3 und 7). (ohne Fall # 3 unten aufgeführten)

  2. Alle Duplikate durch die alle vier Säulen (Row mit ID_pk 3 und 8).

  3. alle Duplikate von Customer_ID aber mit nicht LNAME passenden und/oder FNAME (Reihe mit ID_pk 1, 2, 4 und 5) (Diese Zeilen haben zur Validierung zurück an Vertriebsmitarbeiter werden.)

Antwort

3

Diese Dinge zu tun hängt stark von verschachtelten Abfragen, der GROUP BY-Klausel und der COUNT-Funktion ab.

Teil 1 - Einzigartige Reihen

Diese Abfrage zeigt Ihnen alle Zeilen, in denen die Kunden-ID hat Daten übereinstimmen.

SELECT Customer_ID, Customer_FNAME, Customer_LNAME FROM dbo.customers WHERE Customer_ID IN (
    SELECT Customer_ID FROM (
     SELECT DISTINCT Customer_ID, Customer_FNAME, Customer_LNAME FROM dbo.customers 
     GROUP BY Customer_ID, Customer_FNAME, Customer_LNAME 
    ) Customers 
    GROUP BY Customer_ID 
    HAVING COUNT(Customer_ID) = 1 
) 
GROUP BY Customer_ID, Customer_FNAME, Customer_LNAME 

Teil 2 - Dubletten

Diese Abfrage zeigt Ihnen alle Zeilen, die die gleichen Daten eingegeben mehr als einmal haben.

SELECT Customer_ID, Customer_FNAME, Customer_LNAME 
FROM dbo.customers 
GROUP BY Customer_ID, Customer_FNAME, Customer_LNAME 
HAVING COUNT(Customer_ID) > 1 

Teil 3 - Nicht übereinstimm Daten

Diese Abfrage ist im Grunde die gleiche wie die erste, nur für einen anderen COUNT Wert suchen.

SELECT Customer_ID, Customer_FNAME, Customer_LNAME FROM dbo.customers WHERE Customer_ID IN (
    SELECT Customer_ID FROM (
     SELECT DISTINCT Customer_ID, Customer_FNAME, Customer_LNAME FROM dbo.customers 
     GROUP BY Customer_ID, Customer_FNAME, Customer_LNAME 
    ) Customers 
    GROUP BY Customer_ID 
    HAVING COUNT(Customer_ID) > 1 
) 
GROUP BY Customer_ID, Customer_FNAME, Customer_LNAME 
+0

Vielen Dank Phillip. Ich benutzte Count, Group By, IN, Not Exists und verschachtelte Sub-Abfragen, aber die Sequenz war von der Strecke! – enigma6205

1

Sie einen CTE (Common Table Expression) verwenden: https://msdn.microsoft.com/en-us/library/ms175972.aspx

;WITH checkDup AS (
     SELECT Customer_ID, ROW_NUMBER() OVER (PARTITION BY Customer_ID ORDER BY Customer ID) AS 'RN' 
     FROM Table) 
     SELECT Customer_ID FROM checkDup 
     WHERE RN = 1; 

Werden Sie Ihre Beispielausgabe geben.

Sie können den CTE manipulieren, um die anderen Ergebnisse zu erhalten, die Sie suchen.