
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にまとめられず、困っております。
自己結合なのか、サブクエリなのか、別の方法なのか。
アドバイス頂けたらと思います。
宜しくお願いします
No.2ベストアンサー
- 回答日時:
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している単位をそれぞれ銀行および月で処理すれば宜しいかと思います。
ありがとうございます。
FROM内でのサブクエリですね。
サブクエリが不得手なので、解読に時間をかけてます。
もう、しばらくおまちください。
No.3
- 回答日時:
月は月初日を入れておくといいです
#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銀行は入出金データがない
入出金データがない月は前繰も次繰も拾えないので、カレンダーテーブルを
別途つくって処理するなど工夫が必要です
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
mysqlがインストールされている...
-
エラー 1068 (42000): 複数の主...
-
(初心者)MySQLやmaraDBで、crea...
-
#1062 - '0' は索引 'PRIMARY' ...
-
WHERE `年月日` = '晴' OR `年...
-
SQLです教えてくださいお願いし...
-
SQLです教えてくださいお願いし...
-
SELECT * FROM `生徒名簿` INNE...
-
〜のような結果を出すためのSQL...
-
SQLです!!教えてください。
-
phpMyAdminをCentOS7にインスト...
-
テーブル名が可変の場合のクエ...
-
htmlコードで書かれた表にphpで...
-
無料なのに支払するのか!です...
-
何にかが違うから エラーなんで...
-
SELECT * from tは掛け算ではな...
-
同じテーブルを結合して前回の...
-
MAMP MySQl でコマンドプロンプ...
-
mysql>status で
-
同一日に複数レコードがある場...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VIEWに対してWHERE句をつける
-
空白文字を含む文字列データの検索
-
JOIN使ってないのに、JOIN操作...
-
コマンドプロンプト 複数の実...
-
複数テーブルの集計
-
Mysql 同一テーブルの複数「別...
-
Null値が入れられない
-
nullと同じく空白をCountしない...
-
SQLでLIMIT句を入れるとエラー...
-
テーブル作成時に、「`id` int(...
-
sqlの中で、 例えば条件句で AN...
-
NULLを含む列の足し算
-
SQL文を入力したらエラー
-
phpとSQLで複数条件で検索する...
-
auto_incrementの開始値を自分...
-
mysqlでオートナンバーにするに...
-
先ほども質問していたのですが...
-
mysqlのselectについて
-
3つのテーブルを連携した並び...
-
varchar型を主キーに…
おすすめ情報
回答ありがとうございます。
table1は、ある月の入出金のデータです、実際には、日付のデータになっています。
IDも存在します。
ほしい結果は、3月時点の各銀行の数字なので(4月のデータは見ません)、
A銀行 前月残:0 当月入金:0 当月出金:200 繰越:-200
B銀行 前月残:100 当月入金:100 当月出金:100 繰越:100
頂いた回答は検証しております。
もし、認識と違うようでしたら、再度アドバイスをお願いします。
宜しくお願いします。
お二人のアドバイスをいただき、無事に取得できました。
ありがとうございます。
一番参考にさせて頂いた方に、ベストアンサーにさせて頂きました。
作成したSQLでのポイントは
select xxx
from
(select xxx ) as b,
(select xxx ) as c
の部分と、最後のWHEREのところでした。
とても参考になりました。
ありがとうございます。