2010-08-17 9 views
8

Cette requête renvoie la somme des ventes quotidiennes « fermé » pour un vendeur particulier dans une plage de dates particulière:Sélection même colonne avec différentes où les conditions

 
SELECT SUM(price) as closed_total 
FROM dbo.Sales 
WHERE salesperson_ID = @salesperson_ID 
     AND date_ordered BETWEEN @start_date AND @end_date 
     AND closed = 1 
GROUP BY date_ordered 

La sortie ressemble à:

 
daily_total 
200 
150 
325 
120 
(etc) 

Je voudrais modifier la requête pour retourner une colonne pour les ventes fermées et une colonne pour toutes les ventes (même requête, mais sans la condition 'closed = 1'), avec une sortie comme ceci:

 
closed_total | all_total 
200   | 275 
150   | 150 
325   | 500 
120   | 280 
(etc) 

J'ai essayé d'utiliser UNION pour combiner les requêtes distinctes, comme ceci:

 
SELECT SUM(price) as closed_total 
FROM dbo.Sales 
WHERE salesperson_ID = @salesperson_ID 
     AND date_ordered BETWEEN @start_date AND @end_date 
     AND closed = 1 
GROUP BY date_ordered 
UNION ALL 
SELECT SUM(price) as all_total 
FROM dbo.Sales 
WHERE salesperson_ID = @salesperson_ID 
     AND date_ordered BETWEEN @start_date AND @end_date 
GROUP BY date_ordered 

Je pensais que cela pourrait faire ce que je cherchais, mais il met les deux sommes dans une seule colonne nommée « closed_total ». Des idées?

Répondre

12

Vous pouvez essayer

SELECT SUM(price) as total, SUM(CASE WHEN closed = 1 THEN price ELSE 0 END) as closed_total 
FROM dbo.Sales 
WHERE salesperson_ID = @salesperson_ID 
     AND date_ordered BETWEEN @start_date AND @end_date 
GROUP BY date_ordered 
+0

C'est génial, merci! – Ethan