2016-08-18 114 views
0

比方说,我有这样的MySQL的选择计算2场基于其他领域

| user | symbol | status | value | 
---------------------------------- 
| 101 | A  | 1  | 20 | 
| 102 | A  | 1  | 20 | 
| 103 | A  | 1  | 20 | 
| 101 | A  | 0  | 20 | 
| 102 | B  | 1  | 20 | 
| 103 | A  | 1  | 20 | 
| 101 | A  | 0  | 20 | 
| 102 | A  | 1  | 20 | 
| 103 | A  | 0  | 20 | 
| 101 | B  | 1  | 20 | 
| 102 | A  | 0  | 20 | 

一个表,我想这样的结果(所有的值更改为零下具有状态= 0)

| user | symbol | differences | 
---------------------------------- 
| 101 | A  | -20   | 
| 101 | B  | 20   | 
| 102 | A  | 20   | 
| 102 | B  | 20   | 
| 103 | A  | 20   | 

请帮助,任何帮助,将不胜感激!

+0

你想要更新/选择查询吗? – 1000111

回答

1

使用CASE表达式用于改变值减去如果status = 0

查询

select `user`, `symbol`, 
sum(case when `status` = 0 then `value` * -1 else `value` end) as differences 
from `your_table_name` 
group by `user`, `symbol` 
order by `user`, `symbol`; 

SQL Fiddle demo

1

下面使用CASE..WHEN一个通用的解决方案:在这种特殊情况下

SELECT user, 
     symbol, 
    CASE WHEN status > 0 THEN value 
     ELSE -value END as differences 
FROM yourTable; 

虽然,你也可以使用数学:

SELECT user, 
     symbol, 
     (value * (2*status-1)) as differences 
    FROM yourTable; 

如果你也想聚集的结果,那么你可以改变以上查询使用GROUP BYSUM作为聚合:

SELECT user, 
     symbol, 
    SUM(CASE WHEN status > 0 THEN value 
     ELSE -value END) as differences 
FROM yourTable 
GROUP BY user, symbol; 

以及等效聚合的查询,使用算术:

SELECT user, 
     symbol, 
     SUM(value * (2*status-1)) as differences 
    FROM yourTable 
GROUP BY user, symbol; 
+0

状态值为零和一,将'value * -status'将其转换为零,而不是将其转换为负值。 –

+1

正确的数学解决方法是'(2 * status-1)*值' –

+0

@NavedAlam是的,你绝对正确:) –