2010-11-25 6 views
0

Je voudrais obtenir quelque chose comme ceci:Obtenez SOMME des ventes pour plusieurs années dans les colonnes

*Customer *2009  *2010 * 
|------------|---------|--------| 
|Peter  |120  |240  | 
|Johe  |455  |550  | 

Ma première approche à la requête était la suivante:

Select c.name, sum(o2009.price), sum(o2010.price) from customer c 
join orders o2009 on (o2009.customerId = c.id AND o2009.year = 2009) 
join orders o2010 on (o2010.customerId = c.id AND o2010.year = 2010) 
group by c.id 

Malheureusement cela est complètement faux. Je suppose que je pourrais exécuter 2 requêtes et ensuite construire une union, mais peut-être qu'il y a quelque chose de plus simple?

+0

Nous devons deviner vos structures de table, qui est jamais bon. Mais une table par an ressemble à une erreur de conception. –

+0

ce n'est pas une table par an, il fait juste le nom. – lijie

+0

@lijie: Je dois être fatigué, désolé, mon erreur. –

Répondre

4

que modifier une des réponses pour obtenir des clients sans commande -

Select c.name, 
    Sum(Case When o.year == 2008 Then price Else 0 End) cy2008, 
    Sum(Case When o.year == 2009 Then price Else 0 End) cy2009, 
    Sum(Case When o.year == 2010 Then price Else 0 End) cy2010 
From Customers c left outer join 
    Orders o on o.customer_id = c.customer_id 
Group By c.name 
1

Sous-requête n'est pas conseillé,
mais devrait fonctionner l'astuce

tels que

SELECT 
    c.name, 
(
    SELECT 
    ISNULL(SUM(o2009.price), 0) 
    FROM orders as o2009 
    WHERE 
    o2009.year=2009 AND o2009.customerId=c.id 
) as sum_2009, 
(
    SELECT 
    IFNULL(SUM(o2010.price), 0) 
    FROM orders as o2010 
    WHERE 
    o2009.year=2010 AND o2010.customerId=c.id 
) as sum_2010 
FROM customer c 

Toujours vérifier la requête coût

+0

cela peut s'avérer très moche en termes de performances pour un db avec un grand nombre de clients .. –

+0

Merci pour le commentaire, dans notre cas, nous ne nous en soucions pas vraiment, car nous ne courons que de temps en temps. – Remy

+0

@Remy - Je pense que c'est juste pour vous d'afficher à la fois le coût de la requête pour la comparaison, et toujours utiliser une meilleure et optimisée requête. – ajreal

0

si vous faites select c.name, o.year, sum(o.price) from customer as c inner join orders as o on o.customerId = c.id group by c.id, o.year, vous obtenez quelque chose utilisable, mais pas dans le format que vous voulez.

0

Essayez ceci:

Select c.name, 
    Sum(Case When o2008.year == 2009 Then price Else 0 End) cy2008, 
    Sum(Case When o2009.year == 2009 Then price Else 0 End) cy2009, 
    Sum(Case When o2010.year == 2009 Then price Else 0 End) cy2010 
From Orders o 
Group By`enter code here` c.Name 
+0

cela ne reviendra pas pour le client qui n'a pas passé de commandes – ajreal

+0

Il suffit de faire une jointure à gauche aux clients –

Questions connexes