Comment get une seule ligne pour chaque client en fonction de la valeur la plus élevée dans une autre colonne dans SQL Server

J'ai une table qui contient des informations sur les clients:

-------------------------------------------- |CustID CustType OrderType CountofOrders| |------------------------------------------| | 1 C DD 23 | | 2 IC DE 10 | | 2 IC DR 7 | | 2 IC DS 7 | | 3 C DR 14 | | 3 C DS 19 | | 4 IC DS 5 | | 4 IC DR 5 | | 4 IC DE 3 | | 5 IC DR 7 | | 5 IC DS 7 | | 5 IC DE 7 | -------------------------------------------- 

Je veux tirer tous les loggings pour les clients lorsque CustType n'est pas 'IC', quel que soit le nombre de lignes qu'ils ont.

Ainsi, par exemple, CustID 1 returnnera 1 ligne tandis que CustID 3 returnnera 2 lignes. Lorsque le CustType est 'IC', je veux seulement tirer une seule ligne pour ce client basé sur CountofOrders les plus élevés.

Donc, pour CustID 2, il devrait tirer l'logging avec OrderType 'DE' et CountofOrders comme 10.

Si le client 'IC' a le même nombre pour les différents OrderTypes, alors je veux get la ligne où le type de command est 'DE'. Si le type de command n'est pas 'DE', je veux que la ligne avec le type de command soit 'DS'. En bref, la priorité doit être donnée à OrderType 'DE', suivi de 'DS', 'DR' et 'DD'

Donc, ma sortie finale devrait ressembler à ceci:

 ------------------------------------------- |CustID CustType OrderType CountofOrders| -------------------------------------------| | 1 C DD 23 | | 2 IC DE 10 | | 3 C DR 14 | | 3 C DS 19 | | 4 IC DS 5 | | 5 IC DE 7 | -------------------------------------------- 

J'ai été en mesure d'utiliser la requête suivante pour get le meilleur pour quand le CountofOrders n'est pas le même, mais j'ai du mal à comprendre comment get une ligne basée sur le OrderType lorsque le CountofOrders est le même entre les différents OrderTypes .

 SELECT a.CustID, a.CustType, a.OrderType, a.CountofOrders FROM CustInfo a WHERE a.CountofOrders = (SELECT MAX(CountofOrders) FROM CustInfo b WHERE a.CustID = b.CustID) 

Toute aide serait grandement appréciée. Merci.

Vous pouvez le faire en utilisant ROW_NUMBER assez facilement. Cela renvoie les résultats que vous avez demandés à partir de vos données d'exemple.

 DECLARE @Customer table ( CustID int , CustType varchar(10) , OrderType char(2) , CountofOrders int ) INSERT @Customer ( CustID , CustType , OrderType , CountofOrders ) VALUES (1, 'C', 'DD', 23) , (2, 'IC', 'DE', 10) , (2, 'IC', 'DR', 7) , (2, 'IC', 'DS', 7) , (3, 'C', 'DR', 14) , (3, 'C', 'DS', 19) , (4, 'IC', 'DS', 5) , (4, 'IC', 'DR', 5) , (4, 'IC', 'DE', 3) , (5, 'IC', 'DR', 7) , (5, 'IC', 'DS', 7) , (5, 'IC', 'DE', 7) SELECT x.CustID , x.CustType , x.OrderType , x.CountofOrders FROM ( SELECT * , ROW_NUMBER() over(partition by CustID order by CountOfOrders desc , case OrderType when 'DE' then 1 when 'DS' then 2 when 'DR' then 3 when 'DD' then 4 else 5 end) as RowNum FROM @Customer ) x WHERE x.CustType <> 'IC' OR x.RowNum = 1 ORDER BY CustID , CountofOrders 

Je pense que votre exigence ne peut pas être faite au niveau de la requête car la command est basée sur la priorité. Je veux dire que vous devez utiliser quelque chose comme une procédure stockée ou faire le process de command dans votre application