2010-06-30 8 views
4

J'essaie d'écrire une requête dans SQL Server pour savoir s'il y a plusieurs lignes pour chaque client par customerID. S'il vous plaît faites le moi savoir.Requête SQL avec des enregistrements en double

Voici la structure de la table

Customer table 
----------------------------------------- 
orderID   CustName  CustomerID 
--------------------------------------- 
100    test   123456  
101    test   123456 

Orders table 
------------------------------------ 
pID    OrderID 
----------------------------------- 
1     100   
2     101 
+5

Si vous êtes dans un endroit pour modifier la conception, s'il vous plaît noter que Votre question découle de l'existence de «groupes récurrents» dans votre table client («normalisation de la base de données google»). Une manière plus sensée de structurer ceci, en supposant que chaque commande est faite par un seul client, est de placer CustomerID dans la table Order au lieu de OrderID dans la table Customer. – grossvogel

Répondre

14

Vous pouvez utiliser une requête GROUP BY pour y parvenir:

select CustomerID, count(*) as NumDuplicates 
from Customer 
group by CustomerID 
having count(*) > 1 
+0

Il existe également un indicateur de succès dans la table Commandes. Je voudrais obtenir toutes les lignes par customerID où le drapeau de succès de table de commandes est 1. – nav100

+0

@ nav100: Vous devriez mettre à jour la question et ajouter cette nouvelle condition. Il change la requête. – FrustratedWithFormsDesigner

0
select CustomerID, count(1) 
    from Customer 
group by CustomerID 
having count(1) > 1 
+0

@OMG Poneys: en fait, c'est compter la constante 1 non ordinale ... (au moins dans SQL Server). En outre, que ferait SUM (1)? – gbn

+0

@OMG Poneys: 1 est utilisé ici comme une constante. –

+0

Désolé, je pensais que c'était la notation ordinale. J'utilise toujours des colonnes ou * ... –

4

pour voir combien de chaque client que vous avez:

SELECT COUNT(*), CustName, CustomerID 
from Customer 
Group by CustName, CustomerID 

Vous pouvez utiliser un having clause de limiter à double emploi:

SELECT COUNT(*), CustName, CustomerID 
from Customer 
Group by CustName, CustomerID 
having count(*) > 1 

MISE À JOUR

Pour obtenir ceux qui ont des commandes réussies:

select count(*), CustName, CustomerID 
from(
    SELECT CustName, CustomerID 
    from Customer, orders 
    where customer.orderID = orders.orderID 
    and orders.success = 1) subquery 
group by subquery.CustName, subquery.CustomerID 
having count(*) > 1; 
+0

Voici la requête que j'ai trouvé. Mais c'est 2 requêtes. Sélectionnez customerID du client select * from Commandes où orderID dans (sélectionnez OrderId from Customer où customerID = 123456) et success = 1 – nav100

Questions connexes