2010-10-15 5 views
1

J'ai besoin d'aide pour que mes doublons n'apparaissent pas une fois dans ma sortie.Aide pour les doublons dans la sortie

SELECT 
    accountNumber AS 'Member Number', 
    OD.orderdetails AS 'iNum', 
    FirstName AS 'First Name', 
    LastName AS 'Last Name', 
    HGP.email AS 'Email', 
    points AS 'Points -->', 
    '$' + CONVERT(varchar(50),(CONVERT(int,Points) * .1)) AS '<-- Amount', 
    CountryCode AS 'Country', 
    CONVERT(VARCHAR(10), issued, 101) AS 'Order Date', 
    CONVERT(VARCHAR(10), cs.RedeemedDate, 101) AS 'R Date' 
FROM tblHGP HGP, OrderDetails OD, tblInvoices i 
JOIN tblCS cs ON i.InvoiceNumber = cs.InvoiceNumber 
JOIN tblECI ac ON i.InvoiceNumber = ac.InvoiceNumber 
    AND cs.Sold = ac.ECIID 
WHERE 
    i.InvoiceNumber = HGP.invoiceNumber 
    AND HGP.issued BETWEEN '2010-01-01' AND '2010-09-01' 
    AND HGP.invoiceNumber = OD.orderdetails 
ORDER BY 
    HGP.issued 

Comme je l'ai dit ci-dessus, je reçois des doublons sur certains des utilisateurs. J'ai essayé le distinct mais ne semble pas fonctionner.

Toute aide serait géniale! : O)

David

+1

Je voudrais nettoyer cette requête un peu en enlevant deux des clauses WHERE qui agissent comme des jointures et en utilisant JOIN explicitement pour ces deux tables (tblHGP et tblInvoices). – Bernard

Répondre

1

Il me semble que vous utilisez uniquement la jointure à OrderDetails pour cela:

OD.orderdetails AS 'iNum', 

Comme le montre votre clause where, vous pouvez obtenir cette même valeur de HGP:

AND HGP.invoiceNumber = OD.orderdetails 

Ainsi, vous pouvez éliminer la totalité de la jointure en OD et éliminer votre duplication en raison de plusieurs lignes dans la table des détails d'une facture. Alors, réécrite il devrait ressembler à ceci:

SELECT 
    accountNumber AS 'Member Number', 
    HGP.invoiceNumber AS 'iNum', 
    FirstName AS 'First Name', 
    LastName AS 'Last Name', 
    HGP.email AS 'Email', 
    points AS 'Points -->', 
    '$' + CONVERT(varchar(50),(CONVERT(int,Points) * .1)) AS '<-- Amount', 
    CountryCode AS 'Country', 
    CONVERT(VARCHAR(10), issued, 101) AS 'Order Date', 
    CONVERT(VARCHAR(10), cs.RedeemedDate, 101) AS 'R Date' 
FROM tblHGP HGP, tblInvoices i 
JOIN tblCS cs ON i.InvoiceNumber = cs.InvoiceNumber 
JOIN tblECI ac ON i.InvoiceNumber = ac.InvoiceNumber 
    AND cs.Sold = ac.ECIID 
WHERE 
    i.InvoiceNumber = HGP.invoiceNumber 
    AND HGP.issued BETWEEN '2010-01-01' AND '2010-09-01' 
ORDER BY 
    HGP.issued 

Je ne peux pas dire avec certitude si les noms de colonnes qualifiés non-tables (c.-à-émission, Points, CountryCode, FirstName, LastName) viennent de OrderDetails ou non, bien qu'ils ne semblent pas comme ils le feraient.

+0

Theres aucune colonne nommée invoiceNumber dans HGP – StealthRT

+0

Selon la question il ya, regardez dans la clause where: WHERE _i.Numéro d'appel = HGP.invoiceNumber_ ET HGP.issued ENTRE «2010-01-01» ET «2010-09- 01 ' _AND HGP.invoiceNumber = OD.orderdetails_ – BlackICE

+0

Ah, oui. Ok je l'ai changé mais j'obtiens toujours les mêmes résultats finaux. – StealthRT

2

Plus de détails. À partir de la requête, il semble que vous obteniez un double chaque fois qu'une facture contient plus d'un détail de commande (plus d'un article commandé). Cela ressemble à un design. Naturellement, cela ne marcherait pas parce que tous les champs ne seraient pas identiques.

Fondamentalement, si un utilisateur reçoit une facture pour 2 articles dans une facture, il apparaîtra (ainsi que la facture) deux fois.

+0

Merci pour la réponse, TomTom (ha). Vous avez raison d'avoir une facture différente pour la même personne mais y at-il de toute façon ** combiner les mêmes utilisateurs nommés qui ont plusieurs factures à un seul chacun? ** – StealthRT

+1

Vous devez supprimer la commande orderdetails join, ou si vous besoin de voir les totaux orderdetail ou les totaux ajouter un groupe par pour eux. – BlackICE

Questions connexes