2016-06-14 9 views
1

Diese Frage ist Upgrade-Version here. Die Lösung von Herrn Giorgos Betsos funktioniert gut. Wie auch immer, ich habe meine Anforderung aktualisiert, um nach PRODUCT_ID zu filtern. suchen jetzt neue Tabelle wie dieseSQL: ADD & MINUS basierend auf Feldtyp mit GROUP BY-Bedingung

ID | BALANCE | ACTION_QTY | ACTION_TYPE | PRODUCT_ID | 
---------------------------------------------------------------------| 
1 |  0  |  3  |  ADD  |  12  | 
2 |  0  |  2  |  DEDUCT |  12  | 
3 |  0  |  6  |  ADD  |  11  |  
4 |  0  |  3  |  ADD  |  11  | 
5 |  0  |  1  |  DEDUCT |  12  | 
6 |  0  |  7  |  ADD  |  15  | 
7 |  0  |  1  |  DEDUCT |  15  | 
8 |  0  |  3  |  ADD  |  15  | 
9 |  0  |  7  |  DEDUCT |  11  | 
10 |  0  |  9  |  ADD  |  12  | 

SQL FIDDLE

Wie kann ich tun, um das Add/minus zu BALANCE Feld basierend auf PRODUCT_ID und Ordnung von ID? @Giorgos Betsos SQL:

SELECT ID, 
     @s := IF(ACTION_TYPE='ADD', @s + ACTION_QTY, @s - ACTION_QTY) AS BALANCE, 
     ACTION_QTY, 
     ACTION_TYPE 
FROM tableA 
CROSS JOIN (SELECT @s := 0) AS var 
ORDER BY ID 

ich versuchte GROUP BY PRODUCT_ID, aber das Ergebnis ist nicht korrekt hinzuzufügen.

Ergebnis, das ich will, ist unten wie:

ID | BALANCE | ACTION_QTY | ACTION_TYPE | PRODUCT_ID | 
---------------------------------------------------------------------| 
1 |  3  |  3  |  ADD  |  12  | 
2 |  1  |  2  |  DEDUCT |  12  | 
3 |  6  |  6  |  ADD  |  11  |  
4 |  9  |  3  |  ADD  |  11  | 
5 |  0  |  1  |  DEDUCT |  12  | 
6 |  7  |  7  |  ADD  |  15  | 
7 |  6  |  1  |  DEDUCT |  15  | 
8 |  9  |  3  |  ADD  |  15  | 
9 |  2  |  7  |  DEDUCT |  11  | 
10 |  9  |  9  |  ADD  |  12  | 

Bitte helfen Sie mir, Vielen Dank

Antwort

1

Sie können es mit CASE EXPRESSION innerhalb einer korrelierten Abfrage:

SELECT s.id, 
     (SELECT sum(CASE WHEN t.action_type = 'ADD' THEN t.action_qty ELSE -1*t.action_qty END) 
     FROM (YourQuery) t 
     WHERE t.id <= s.id and t.product_id = s.product_id), 
     s.action_qty,s.action_type,s.product_id 
FROM (YourQuery) s 
ORDER BY s.id 

Der Fall wird bestimmen, ob der Wert summiert werden soll, oder die Summe value*-1 durch den Wert in der Spalte action_type summieren.

+0

Arbeit perfekt :) final SQL ausführen: http: //sqlfiddle.com/#!9/2ceae6/11 – Teddybugs

0

Sorry, ich bin mir nicht sicher, ob ich es richtig verstehe. Sie möchten also nur ACTION_QTY über das Feld ACTION_TYPE summieren? versuchen wie folgt aus:

SELECT ID, 
     SUM (
     IF(ACTION_TYPE='ADD', ACTION_QTY, -1 * ACTION_QTY) 
     ) AS BALANCE, 
     ACTION_QTY, 
     ACTION_TYPE 
FROM tableA 
GROUP BY PRODUCT_ID 
ORDER BY PRODUCT_ID; 

** Probe

die Tabelle erstellen

MariaDB [bb]> CREATE TABLE tableA 
    -> (`ID` int, `BALANCE` decimal(10,4), `ACTION_QTY` decimal(10,4), `ACTION_TYPE` varchar(100), `PRODUCT_ID` int(20)) 
    -> ; 
Query OK, 0 rows affected (0.41 sec) 

MariaDB [bb]> 
MariaDB [bb]> INSERT INTO tableA 
    -> (`ID`, `BALANCE`, `ACTION_QTY`, `ACTION_TYPE`, `PRODUCT_ID`) 
    -> VALUES 
    -> (1, '0.00', '3', 'ADD', '12'), 
    ->  (2, '0.00', '2', 'DEDUCT', '12'), 
    ->  (3, '0.00', '6', 'ADD', '11'), 
    ->  (4, '0.00', '3', 'ADD', '11'), 
    ->  (5, '0.00', '1', 'DEDUCT', '12'), 
    ->  (6, '0.00', '7', 'ADD', '15'), 
    ->  (7, '0.00', '8', 'DEDUCT', '15'), 
    ->  (8, '0.00', '3', 'ADD', '15'), 
    ->  (9, '0.00', '7', 'DEDUCT', '11'), 
    ->  (10,'0.00', '9', 'ADD', '12') 
    -> ; 
Query OK, 10 rows affected (0.08 sec) 
Records: 10 Duplicates: 0 Warnings: 0 

die Abfrage

MariaDB [bb]> SELECT ID, 
    ->  SUM(
    ->   IF(ACTION_TYPE='ADD', ACTION_QTY, -1 * ACTION_QTY) 
    ->  ) AS BALANCE, 
    ->  ACTION_QTY, 
    ->  ACTION_TYPE 
    -> FROM tableA 
    -> GROUP BY PRODUCT_ID 
    -> ORDER BY PRODUCT_ID; 
+------+---------+------------+-------------+ 
| ID | BALANCE | ACTION_QTY | ACTION_TYPE | 
+------+---------+------------+-------------+ 
| 3 | 2.0000 |  6.0000 | ADD   | 
| 1 | 9.0000 |  3.0000 | ADD   | 
| 6 | 2.0000 |  7.0000 | ADD   | 
+------+---------+------------+-------------+ 
3 rows in set (0.03 sec) 

MariaDB [bb]> 
+0

Dadurch wird ein einzelner Datensatz zurückgegeben. – sagi

+0

@sagi - ups, mein Fehler, ich kopiere nicht alles. Ich habe meine Antwort geändert –

+0

Jetzt wird die Summe nicht kumulative Summe sein. – sagi