0

よろしくお願いします。

状況は私がこれらの2つのテーブルを持っているということです:

表1:借方。例:

    date       item   value_debits
    2012-08-01 item1  10
    2012-08-03 item2  15

表2:クレジット。例:

    date       item   value_credits
    2012-07-31 item3  20
    2012-08-02 item4  30  

望ましい結果:

    date       item   value  balance
    2012-07-31 item3  20     20
    2012-08-01 item1  (10)   10
    2012-08-02 item4  30     40
    2012-08-03 item3  (15)   25

各テーブルの累積値を個別に簡単に計算できます。

set @cumulative :=0;
select date, item, value_debits, @cumulative := @cumulative + value_debits AS "Cumulated" 
from debits
order by date DESC

これを取得するために、これら2つのテーブルを結合して日付順に並べ替えることはそれほど難しくありません。

    date       item   value
    2012-07-31 item3  20
    2012-08-01 item1  10
    2012-08-02 item4  30
    2012-08-03 item3  15

しかし、望ましい結果を得る方法は私を超えています。

前もって感謝します!

4

2 に答える 2

1

以下を使用できます。

SELECT     a.date,
           a.item,
           CASE 
               WHEN a.value < 0 THEN CONCAT('(', a.value, ')') 
               ELSE a.value
           END AS value,
           @bal:=@bal+a.value AS balance
FROM       (
           SELECT date, item, value_debits*-1 AS value FROM debits
           UNION ALL
           SELECT date, item, value_credits FROM credits
           ) a
CROSS JOIN (SELECT @bal:=0) bal_init
ORDER BY   a.date

このSQLFiddle Demoを見てください

于 2012-08-03T22:28:27.720 に答える
0

これが、あなたのソリューションに対する私の明らかに非効率的な試みです。時間があれば、もっと効率的な方法を考えてみます。ただし、機能します。

SELECT U.`date`, U.item, U.value, 
  (SELECT SUM(U2.value) FROM 
     (SELECT `date`,item,-value_debits as value
      FROM debits
      UNION ALL
      SELECT `date`,item,value_credits as value
      FROM credits
     ) AS U2
   WHERE `date` <= U.date) 
   AS balance 
FROM 
  (SELECT `date`,item,-value_debits as value
   FROM debits
   UNION ALL
   SELECT `date`,item,value_credits as value
   FROM credits
  ) AS U
ORDER BY `date`

貸方と借方が同じテーブルにあると、これは少し簡単になります。

より良いソリューション

SET @total=0;
SELECT U.`date`, 
       U.item, 
       CASE WHEN U.value<0 
          THEN CONCAT('(', -U.value, ')') 
          ELSE U.value
       END as value, 
       @total:=@total+value AS balance
FROM (SELECT `date`,item,-value_debits as value
      FROM debits
      UNION ALL
      SELECT `date`,item,value_credits as value
      FROM credits
     ) AS U
ORDER BY U.`date`;
于 2012-08-03T20:48:15.227 に答える