在列中获得多年销售额的总和

时间:2010-11-25 15:24:13

标签: sql mysql

我想得到这样的东西:

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

我的第一个查询方法是:

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

不幸的是,这是完全错误的。我想我可以运行2个查询然后构建一个联合,但也许有更简单的东西?

4 个答案:

答案 0 :(得分:4)

只需修改其中一个答案即可获得没有订单的客户 -

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 :(得分:1)

不建议使用子查询,
但应该解决这个问题

,例如

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

请务必检查查询费用

答案 2 :(得分:0)

如果你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,你可以获得一些可用的东西,但不是你想要的格式。

答案 3 :(得分:0)

试试这个:

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