代码之家  ›  专栏  ›  技术社区  ›  Remy

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

  •  0
  • Remy  · 技术社区  · 15 年前

    我想买这样的东西:

    *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
    

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

    4 回复  |  直到 15 年前
        1
  •  4
  •   Roopesh Shenoy    15 年前

    只是修改其中一个答案,让没有订单的客户-

    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
    
        2
  •  1
  •   ajreal    15 年前

    子查询不可取,
    但应该能起作用

    例如

    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
    

    总是检查查询成本

        3
  •  0
  •   lijie    15 年前

    如果你这样做了 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 ,您可以得到一些可用的内容,但不能使用所需的格式。

        4
  •  0
  •   Charles Bretana    15 年前

    试试这个:

    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