2009-08-27 8 views
0

J'ai cette requête pour extraire le total OrderStatus ayant les valeurs 1 et 5. Comment puis-je additionner seulement OD.OrderStatus = 2, car il peut y avoir plusieurs enregistrements dans la table Orderdetails avec OrderStatus comme 2.Problème d'enregistrement distinct dans la requête MS SQL Server 2008

S'il vous plaît aider

SELECT O.OrderDate, 
Sum(Case When OD.OrderStatus = 2 Then 1 Else 0 End) AS OrdersOffered, 
Sum(Case When OD.OrderStatus = 1 Then 1 Else 0 End) AS OrdersAccepted 
FROM Orders O,OrderDetails OD 
Where O.Order_ID=OD.Order_ID 
GROUP BY OrderDate 
+0

S'il vous plaît fournir quelques exemples de données et les résultats que vous recherchez. Jusqu'à présent, la description que vous donnez semble incomplète ou contradictoire et nous ne pouvons pas comprendre ce que vous essayez vraiment de faire. – RBarryYoung

Répondre

1

Alors, vous voulez qu'il soit 1, peu importe combien vous en avez? Peut-être utiliser SIGN? Il suffit d'utiliser une sous-requête pour vous aider à obtenir votre résultat.

SELECT O.OrderDate 
    ,SIGN(Sum(Case When OD.OrderStatus = 2 Then 1 Else 0 End)) AS OrdersOffered 
    ,Sum(Case When OD.OrderStatus = 1 Then 1 Else 0 End) AS OrdersAccepted 
FROM Orders O 
    JOIN OrderDetails OD ON O.Order_ID=OD.Order_ID 
GROUP BY OrderDate 
+0

Merci. Je pense que j'ai besoin de SOMME (Signe (Cas quand OD.OrderStatus = 2 Puis 1 Sinon 0 End)) AS CommandesOffered Je dois l'essayer demain. Je ne sais pas si cela fonctionnera. – acadia

+0

Non. Supposons que vous ayez dix OrderStatus = 2 enregistrements. SOMME (SIGNE (ajoutera beaucoup 1s pour obtenir 10. Vous voulez convertir le 10 (Sum) en 1. C'est donc SIGNE (SOMME (, pas SOMME (SIGNE ( –

+0

Merci Rob.) Voici ma préoccupation. query J'ai une plage de dates dans where clause.Il retourne pour chaque date dans la plage, il affichera orderdate, ordersoffered, ordersaccepted Mais OrderID 10010 peut avoir 10 ordres avec le statut de 2 mais il devrait considérer seulement 1 mais pour le même date La somme pour OrderIDs 10010, 10011,10012,10013 devrait être 3 et non 1. Merci – acadia

0

SELECT 
O.OrderDate, 
Sum(Case When OD.OrderStatus = 2 Then 1 Else 0 End) AS OrdersOffered, 
Sum(Case When OD.OrderStatus = 1 Then 1 Else 0 End) AS OrdersAccepted 
FROM Orders O inner join 
    (Select distinct Order_ID,OrderStatus 
    from OrderDetails) OD on O.Order_ID=OD.Order_ID 
GROUP BY OrderDate 

devrait faire l'affaire ...

Questions connexes