2016-04-25 13 views
0

フィールドにバランス計算になりますRESULTのように、私は以下のようにデータのセットを構成されており、私は結果を取得したい2つのテーブルを持っている:私はMySQLの概要

をバランスフィールドにはまって、どのようにバランスを実行するのですか?

tblIn

in_date | code | in_qty 
-----------|---------|--------- 
2016-04-01 | aaa  | 100 
2016-04-02 | 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  | 100  | 0  | 200 
2016-04-02 | aaa  | 0  | 100  | 100 
2016-04-03 | aaa  | 200  | 0  | 300 
2016-04-06 | aaa  | 400  | 0  | 700 
2016-04-08 | aaa  | 0  | 400  | 300 

Q私はその結果、この種のをしたい場合は、このクエリはRESULTのような結果が、何を得るでしょう

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; 

ueryで(@ 1000111に感謝)。 MySQLは2016-04-03まで一括して要約し、次の日の詳細を続行します。

結果1

date  | code | in_qty | out_qty | balance 
-----------|---------|----------|----------|--------- 
2016-04-03 | aaa  | 0  | 0  | 300 
2016-04-06 | aaa  | 400  | 0  | 700 
2016-04-08 | aaa  | 0  | 400  | 300 

答えて

0

このクエリを試してみてください..私は2016-04-02でそれをテストしたが、1つの行を変更して自由に感じますそれはあなた

SELECT @startDate date, 
     -- all this below to determine code since code has to come from somewhere 
     -- for now we'll just select code of the latest date that is before 
     -- or equal to @startDate 
     (SELECT TCode.code FROM 
      (SELECT code,in_date FROM tblin WHERE in_date <= @startDate 
      UNION ALL 
      SELECT code,out_date FROM tblout WHERE out_date <= @startDate)TCode 
     ORDER BY TCode.in_date DESC 
     LIMIT 1 
     ) as Code, 
     0,0, 
     balance 
     FROM 
     (SELECT @prevbalance :=(SELECT SUM(in_qty) FROM tblin, 
-- Change the date in below line to any date you desire as @startDate is used throughout this whole query 
           (SELECT @startDate := DATE('2016-04-02'))TDATE WHERE in_date <= @startDate)- 
           (SELECT SUM(out_qty) FROM tblout WHERE out_date <= @startDate) as balance)T4 
UNION ALL 
SELECT * FROM 
    (SELECT T.*,@balance := @balance + (t.in_qty - t.out_qty) AS balance 
    FROM 
    (SELECT in_date date,code,in_qty,0 AS out_qty FROM tblin WHERE in_date > @startDate 
    UNION ALL 
    SELECT out_date, code,  0,  out_qty FROM tblout WHERE out_date > @startDate 
    )T,(SELECT @balance:[email protected])initial 
    ORDER BY T.date ASC,T.in_qty DESC 
)T3; 

sqlfiddle

のような任意の日付に日付を変更するにはコメントしていますNULLがちょうどIFNULLを(使用しないようにするには10

UPDATE

SELECT @startDate date, 
     -- all this below to determine code since code has to come from somewhere 
     -- for now we'll just select code of the latest date that is before 
     -- or equal to @startDate 
     (SELECT TCode.code FROM 
      (SELECT code,in_date FROM tblin WHERE in_date <= @startDate 
      UNION ALL 
      SELECT code,out_date FROM tblout WHERE out_date <= @startDate)TCode 
     ORDER BY TCode.in_date DESC 
     LIMIT 1 
     ) as Code, 
     0,0, 
     balance 
     FROM 
     (SELECT @prevbalance :=IFNULL((SELECT SUM(in_qty) FROM tblin, 
-- Change the date in below line to any date you desire as @startDate is used throughout this whole query 
                   (SELECT @startDate := DATE('2016-03-02'))TDATE WHERE in_date <= @startDate)- 
             (SELECT SUM(out_qty) FROM tblout WHERE out_date <= @startDate),0 
            ) 
           as balance 
     )T4 
UNION ALL 
SELECT * FROM 
    (SELECT T.*,@balance := @balance + (t.in_qty - t.out_qty) AS balance 
    FROM 
    (SELECT in_date date,code,in_qty,0 AS out_qty FROM tblin WHERE in_date > @startDate 
    UNION ALL 
    SELECT out_date, code,  0,  out_qty FROM tblout WHERE out_date > @startDate 
    )T,(SELECT @balance:[email protected])initial 
    ORDER BY T.date ASC,T.in_qty DESC 
)T3; 
+0

神聖で失敗するようです私はこれを探していますが、ちょっと複雑ですが、2つの別々のクエリを実行する方が良いでしょう。 –

+0

私たちがテーブルの日付よりも少ない日付、たとえば2016-03-01を選択すると、ヌル値を防ぐことができますか? –

+0

IFNULL()で2番目のクエリを参照して、NULLの残高を少なくする前に確認してください。 –

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

    UNION 

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

あなたは、両方の側に "0" を使用したのと同じ(私は任意の固定の日付を意味する)SOMEDATEを使用してみてください。 が動作する可能性があります。

0

私はあなたの日付は2016年4月3日であると仮定してきた、これを試してみてください;)

SELECT 
    @ROWNO:[email protected]+1 AS row_no, 
    TMP1.date, 
    TMP1.code, 
    IF(@ROWNO=1,0,TMP1.in_qty) AS in_qty, 
    IF(@ROWNO=1,0,TMP1.out_qty) AS out_qty, 
    TMP1.balance 
FROM 
    (
     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) TMP1, 
    (SELECT @ROWNO:=0) R 
WHERE 
    TMP1.date >= '2016-04-03' 
ORDER BY 
    TMP1.DATE 
+0

これがある限り1行のみ各日付のためにそこにあるように動作...これは「2016年4月2日」 –