2016-04-21 22 views
1

Ich habe 2 Tabellen, die eine Reihe von Daten, wie unten bestehen, und ich möchte das Ergebnis erhalten, wie in der Folge, die eine Berechnung im Feld hat balance:MySQL Vertikal Horizontal Sum und Vertikal Summe Zur gleichen Zeit

I bin fest auf dem balance Feld, wie bekomme ich die balance läuft?

tblIn

in_date | code | in_qty 
-----------|---------|--------- 
2016-04-01 | aaa  | 100 
2016-04-03 | aaa  | 200 
2016-04-06 | aaa  | 400 

tblOut

out_date | code | out_qty 
-----------|---------|--------- 
2016-04-02 | aaa  | 100 
2016-04-08 | aaa  | 400 

RESULT

date  | code | in_qty | out_qty | balance 
-----------|---------|----------|----------|--------- 
2016-04-01 | aaa  | 100  | 0  | 100 
2016-04-02 | aaa  | 0  | 100  | 0 
2016-04-03 | aaa  | 200  | 0  | 200 
2016-04-06 | aaa  | 400  | 0  | 600 
2016-04-08 | aaa  | 0  | 400  | 200 

QUE RY

SELECT 
    t.date, 
    t. CODE, 
    t.in_qty, 
    t.out_qty 
FROM 
    (
     SELECT 
      date, 
      in_qty, 
      0 AS out_qty 
    FROM tblIn 
     UNION ALL 
     SELECT 
      date, 
      0 AS in_qty, 
      out_qty 
     FROM tblOut 
    ) t 
ORDER BY date ASC 
+0

Sie können 'verwenden union' – Blank

+0

Sorry, vielleicht ist meine Frage nicht ganz klar, ich habe Update mit präziser, was ich –

+0

vielleicht erreichen wollen Ihre' out_qty' von 'out_date' 2016.04.08 ist 400;) – Blank

Antwort

0

Sie können diese Abfrage versuchen:

SELECT 
t.*, 
@prevBalance := (t.in_qty - t.out_qty) + IFNULL(@prevBalance,0) AS balance 
FROM 
(
    SELECT 
     in_date date, 
     code, 
     in_qty, 
     0 AS out_qty 
    FROM tblin 

    UNION 

    SELECT 
     out_date, 
     code, 
     0, 
     out_qty 
    FROM tblout 
) t , (SELECT @prevBalance := NULL) var 
ORDER BY t.date; 

SQL FIDDLE DEMO

Hinweis:

Wenn Sie @prevBalance mit zero Variable initialisieren dann IFNULL(@prevBalance,0) nicht mehr benötigt.

Also, wenn Sie verwenden diese:

(SELECT @prevBalance := 0) var

dann die Spalte wie unten Balance ändern:

@prevBalance := (t.in_qty - t.out_qty) + @prevBalance

+0

Magie passiert, danke –

+0

Sie sind herzlich willkommen :) – 1000111

0

Sie würden normalerweise eine vollständige äußere JOIN mit Datum als gemeinsamer Faktor, aber MySQL nicht zulässt, dass für die vollständige Outer-Joins.

Es gibt eine Arbeit bei der Verbindung um unter

http://www.xaprb.com/blog/2006/05/26/how-to-write-full-outer-join-in-mysql/

Geben Sie die Daten in dem EIN-Zustand.

+0

der Link ist nur darüber, wie die Tabelle ohne andere Funktion als ich bin auf der Suche nach –

1

Hmm, lasst es uns so machen;)

CREATE TABLE IF NOT EXISTS `tblIn` (
    `in_date` date DEFAULT NULL, 
    `code` char(50) DEFAULT NULL, 
    `in_qty` int(11) DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 


CREATE TABLE IF NOT EXISTS `tblOut` (
    `out_date` date DEFAULT NULL, 
    `code` char(50) DEFAULT NULL, 
    `out_qty` int(11) DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

Dann versuchen Sie das, vielleicht arbeiten;)

SELECT TMP.date, TMP.code, TMP.in_qty, TMP.out_qty, @BALANCE:[email protected] + TMP.BALANCE AS balance 
FROM (
    SELECT out_date as date, 
      code, 
      0 as in_qty, 
      out_qty, 
      0-out_qty as balance 
    FROM tblOut 
    UNION 
    SELECT in_date as date, 
      code, 
      in_qty, 
      0 as out_qty, 
      in_qty as balance 
    FROM tblIn) TMP, 
    (SELECT @BALANCE:=0) B 
ORDER BY TMP.date 
+0

das ist super, danke für die Lösung, beide Lösung ist großartig –

Verwandte Themen