2016-08-18 71 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是的,你絕對正確:) –