プロが教える店舗&オフィスのセキュリティ対策術

DBは、Mysqlです。どうかアドバイスをいただきたいです。
宜しくお願いします。

以下のようなテーブル table1 があります。
*******************
table1
*******************
銀行名, 出金, 入金, 月
*******************
A, 100, 0, 2月
B, 0, 100, 2月
A, 0, 100, 2月
A, 100, 0, 3月
B, 100, 0, 3月
B, 0, 100, 3月
A, 100, 0, 3月
B, 0, 100, 4月
...
*******************
3月時点の各口座の出金合計、入金合計、前月残高、翌月繰越を求めたいです。

select
(SUM(t.入金) - SUM(t.出金)) as 前月残高,
SUM(t.入金) as 入金合計,
SUM(t.出金) as 出金合計,
(SUM(t.入金) - SUM(t.出金)) as 翌月繰越
from table1 as t

selectは、こんな感じでまとめたいのですが、それぞれの条件が3月、3月以前、3月以後と異なっているために、一つのselectにまとめられず、困っております。
自己結合なのか、サブクエリなのか、別の方法なのか。

アドバイス頂けたらと思います。
宜しくお願いします

質問者からの補足コメント

  • 回答ありがとうございます。
    table1は、ある月の入出金のデータです、実際には、日付のデータになっています。
    IDも存在します。
    ほしい結果は、3月時点の各銀行の数字なので(4月のデータは見ません)、
    A銀行 前月残:0 当月入金:0 当月出金:200 繰越:-200
    B銀行 前月残:100 当月入金:100 当月出金:100 繰越:100

    頂いた回答は検証しております。
    もし、認識と違うようでしたら、再度アドバイスをお願いします。

    宜しくお願いします。

      補足日時:2016/04/27 14:19
  • お二人のアドバイスをいただき、無事に取得できました。
    ありがとうございます。

    一番参考にさせて頂いた方に、ベストアンサーにさせて頂きました。
    作成したSQLでのポイントは
    select xxx
    from
    (select xxx ) as b,
    (select xxx ) as c
    の部分と、最後のWHEREのところでした。

    とても参考になりました。
    ありがとうございます。

      補足日時:2016/04/27 19:22

A 回答 (3件)

SELECT


B.月
, F.前月残高
, B.出金合計
, B.入金合計
, F.前月残高 + B.入金合計 - B.出金合計 AS 翌月繰越
FROM
( SELECT
A.月
, SUM(A.出金) AS 出金合計
, SUM(A.入金) AS 入金合計
FROM
table1 AS A
GROUP BY
A.月
) AS B
, ( SELECT
D.月
, IFNULL(SUM(E.入金), 0) - IFNULL(SUM(E.出金), 0) AS 前月残高
FROM
( SELECT
C.月
FROM
table1 C
GROUP BY C.月
) AS D
LEFT JOIN table1 AS E
ON D.月 > E.月
GROUP BY
D.月
) AS F
WHERE
B.月 = F.月

銀行Aの2月というデータが複数件あるので、プライマリキーは不明ですが、
銀行ごと、月ごとというならば、GROUP BYしている単位をそれぞれ銀行および月で処理すれば宜しいかと思います。
    • good
    • 0
この回答へのお礼

ありがとうございます。
FROM内でのサブクエリですね。

サブクエリが不得手なので、解読に時間をかけてます。

もう、しばらくおまちください。

お礼日時:2016/04/27 14:25

月は月初日を入れておくといいです


#1で指摘した通り、入出金のデータだけだと結局その前月からの
繰り越しがわからないので、ダミーで1月に各銀行に10000円ずつ入金しておきます

//元データ
create table table1(銀行名 varchar(10), 出金 int, 入金 int , 月 date);
insert into table1 values('A','0','10000','2016-01-01'),('B','0','10000','2016-01-01'),('B','0','100','2016-02-01'),('A','100','0','2016-02-01'),('B','0','100','2016-02-01'),('A','0','100','2016-02-01'),('A','100','0','2016-03-01'),('B','100','0','2016-03-01'),('B','0','100','2016-03-01'),('A','100','0','2016-03-01'),('B','0','100','2016-04-01');

//第一段階:月毎、銀行名毎の入出金および前繰は以下
select
月,銀行名
,(select coalesce(-sum(出金)+sum(入金),0) from table1 where 月<t1.月 and 銀行名=t1.銀行名) as 前月繰越
,sum(出金) as 出金計
,sum(入金) as 入金計
from table1 as t1
group by 月,銀行名

これに次繰を表示するとこうなる
select 月,銀行名,前月繰越,出金計,入金計,前月繰越-出金計+入金計 as 次月繰越
from (
select
月,銀行名
,(select coalesce(-sum(出金)+sum(入金),0) from table1 where 月<t1.月 and 銀行名=t1.銀行名) as 前月繰越
,sum(出金) as 出金計
,sum(入金) as 入金計
from table1 as t1
group by 月,銀行名
) as sub

これのうち、3月のデータをとるので
select 月,銀行名,前月繰越,出金計,入金計,前月繰越-出金計+入金計 as 次月繰越
from (
select
月,銀行名
,(select coalesce(-sum(出金)+sum(入金),0) from table1 where 月<t1.月 and 銀行名=t1.銀行名) as 前月繰越
,sum(出金) as 出金計
,sum(入金) as 入金計
from table1 as t1
group by 月,銀行名
) as sub
where 月='2016-03-01'

ここで問題、命題では4月のA銀行は入出金データがない
入出金データがない月は前繰も次繰も拾えないので、カレンダーテーブルを
別途つくって処理するなど工夫が必要です
    • good
    • 0
この回答へのお礼

ありがとうございます。
こちらも、FROM内でのサブクエリですね。
解読させて頂きます。

お礼日時:2016/04/27 19:12

仮に2月の入金から出金を引いても1月の残高がわからないと


2月の残高はわからない
なので、table1の情報では計算のしようがない
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す