2016-08-18 5 views
0

Lassen Sie uns sagen, ich habe eine Tabelle wie dieseMySQL wählen berechnen 2 Felder basierend auf anderen Feld

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

und ich möchte das Ergebnis wie folgt aus (alle Wertänderung auf minus die Status = 0 haben)

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

Bitte helfen Sie, jede Hilfe wäre willkommen!

+0

Möchten Sie eine Abfrage aktualisieren/auswählen? – 1000111

Antwort

1

einen CASE Ausdruck Verwenden Sie den Wert auf minus für die Änderung, wenn status = 0.

Abfrage

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

Eine generische Lösung CASE..WHEN unter Verwendung:

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

Obwohl in diesem speziellen Fall können Sie auch Mathematik verwenden:

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

Wenn Sie auch die Ergebnisse aggregieren möchten, dann können Sie ändern, die Abfragen über ein GROUP BY mit SUM als Aggregations zu verwenden:

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

und die äquivalente zusammengesetzte Abfrage, mit der Arithmetik:

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

Status-Wert ist Null und Eins, würde "Wert * -Status" es in Null konvertieren, anstatt es in negativ zu verwandeln. –

+1

Korrekte mathematische Workaround wäre '(2 * Status-1) * Wert' –

+0

@NavedAlam ja, du hast absolut Recht :) –

Verwandte Themen