如何根据条件SUM同一列

时间:2016-10-15 18:32:29

标签: sql sum

我需要一个查询(最好是ANSI投诉或者至少可以使用mysql),它会产生以下结果:

+---------+-----------+---------+------------+
| Name    | Order_1   | Order_2 | Total      |
+---------+-----------+---------+------------+
|  User 1 | 18.00     |    0.00 |      18.00 |
|  User 2 |  8.00     |   20.00 |      28.00 |
|  User 3 | 20.00     |    0.00 |      20.00 |
+---------+-----------+---------+------------+

其中order_1是具有标志1的订单总和,order_2是具有标志2的订单总和。以下是表格:

Orders:
+---------+---------+------------+
| id      | cost    | user_id    |
+---------+---------+------------+
|       1 |    8.00 |          1 |
|       2 |   10.00 |          1 |
|       3 |    8.00 |          2 |
|       4 |   20.00 |          2 |
|       5 |   20.00 |          3 |
+---------+-----------+----------+

Users:
+---------+-----------+
| id      | name      | 
+---------+-----------+
|       1 | User 1    | 
|       2 | User 2    | 
|       3 | User 3    | 
+---------+-----------+

Order_flags:
+---------+-----------+
| order_id| flag      |
+---------+-----------+
|       1 |    1      |
|       2 |    1      |
|       3 |    1      | 
|       4 |    2      | 
|       5 |    1      |
+---------+-----------+

2 个答案:

答案 0 :(得分:2)

您可以使用条件聚合执行此操作:

SELECT u.name,
       SUM(CASE WHEN of.flag = 1 THEN cost ELSE 0 END) Order_1,
       SUM(CASE WHEN of.flag = 2 THEN cost ELSE 0 END) Order_2,
       SUM(cost) Total
FROM Users u
JOIN Orders o ON u.id = o.user_id
JOIN Order_flags of ON of.order_id = o.id
GROUP BY u.id, u.name

答案 1 :(得分:0)

你可以使用和案例

select 
      u.name
    , sum( case f.flag = 1 then o.cost else 0 end ) as Order_1
    , sum( case f.flag = 2 then o.cost else 0 end ) as Order_2
    , sum(o.cost)
 from Users as u 
 inner join Orders as o on o.user_id = u.id 
 inner join Order_flags as f on o.id = f.order_id
 group by u.name
相关问题