2017-07-31 2 views
0

j'ai table avec les documents de vente et les factures par exempledonnées de filtrage SQL dans le tableau

 
SalesDoc | Invoice | InvoiceType 
------------------------------------ 
Doc1  | Inv1 | A 
Doc1  | Inv2 | B 
Doc1  | Inv3 | C 
Doc2  | Inv1 | A 
Doc2  | Inv2 | C 
Doc3  | Inv1 | A 
Doc3  | Inv2 | B 

Chaque document de vente peut avoir plus d'une facture par exemple, la facture standard ou proforma ..

je dois filtrer cette table recevoir tableau ci-dessous

Si, pour des ventes doc existent incoice C montrent alors que cette ligne pour que les ventes de doc, sinon vérifiez pour le type B et pour le type A.

 
SalesDoc | Invoice | InvoiceType 
----------------------------------- 
Doc1  | Inv3 | C 
Doc2  | Inv2 | C 
Doc3  | Inv2 | B 

Je sais que je peux stocker les ventes docs dans le tableau temp puis boucle (à l'aide du curseur) et une table de source de filtre pour supprimer des enregistrements inutiles mais je veux être sûr que si est une autre solution que la boucle pour y parvenir

Merci Tomek

Répondre

0

Selon la plus logique, vous pouvez le faire avec des agrégats:

Select SalesDoc, Max(Invoice) as Invoice, Max(InvoiceType) as InvoiceType 
FROM MYSALESTABLE 
GROUP BY SalesDoc 
+0

Merci, avec peu de modifications fonctionne très bien. Mes types de facture réels sont (du plus important) 5, M, U. Donc, ma dernière requête ressemble à

 SELECT DeliveryNo, max(InvoiceNo), MAX(DocTypeVal) FROM ( Select *, \t CASE \t \t WHEN DocType = 'M' THEN 3 \t \t WHEN DocType = '5' THEN 2 \t \t WHEN DocType = 'U' THEN 1 \t END as DocTypeVal FROM ##temp ) as t GROUP BY DeliveryNo