2016-10-15 5 views
1

мне нужен запрос (предпочтительно ANSI рекламации или по крайней мере работает с MySQL), который будет производить следующий результат:Как SUM тот же столбец, основываясь на состоянии

+---------+-----------+---------+------------+ 
| 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

Вы можете сделать это с помощью условной агрегации:

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 
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 
Смежные вопросы