Dans la requête suivante des clients actuels / potentiels, je dois afficher CustomerID, le nom du client, ainsi qu'une colonne indiquant si le client a passé at least une commande ou non. Mais, comme prévu, il affiche plusieurs enregistrements d'un client si le client a passé plusieurs commandes (relation un-à-plusieurs). Question : Comment pouvons-nous afficher ici un seul enregistrement par client étant donné que nous n'avons qu'à indiquer si un client a passé au moins une commande?

SELECT c.customerID, o.OrderID, CASE When ISNULL(o.OrderID, 0) = 0 Then 0 Else 
1 End as YesNO
FROM Customers c
LEFT JOIN Orders o
 ON c.customerID = o.customerID
1
nam 2 mai 2017 à 20:37

3 réponses

Meilleure réponse

En utilisant outer apply()

select 
    c.customerID
  , o.OrderID
  , case when o.OrderID is null then 0 else 1 end as YesNO
from Customers c
  outer apply (
    select top 1 o.OrderID
    from Orders o
    where c.customerID = o.customerID
  ) o

Vous pouvez également utiliser o.OrderId is null au lieu de ISNULL(o.OrderID, 0) = 0.


En utilisant group by et min()

select 
    c.customerID
  , min(o.OrderID) as OrderId
  , case when min(o.OrderID) is null then 0 else 1 end as YesNO
from Customers c
  left join Orders o 
    on c.customerID = o.customerID 
group by c.CustomerID  
2
SqlZim 2 mai 2017 à 17:45

Si l'on en croit la description de votre question, c'est-à-dire que vous voulez savoir si un client a passé une commande mais n'avez pas besoin d'un représentant OrderId pour chaque client:

select C.CustomerId,
  case when exists ( select 42 from Orders as O where O.CustomerId = C.CustomerId )
    then 1 else 0 end as YesNo
  from Customers as C;

Notez que exists est plus efficace que count lorsque vous n'avez pas besoin d'un nombre exact.

0
HABO 2 mai 2017 à 18:20

Utilisez le groupe par.

SELECT c.customerID, o.OrderID, CASE When ISNULL(o.OrderID, 0) = 0 Then 0 Else 1 End as YesNOFROM Customers cLEFT JOIN Orders o ON c.customerID = o.customerID GROUP BY c.customerID
0
berend 2 mai 2017 à 17:40