回答編集履歴

1

chousei

2019/07/30 12:01

投稿

yambejp
yambejp

スコア114843

test CHANGED
@@ -5,3 +5,109 @@
5
5
  適宜呼び出してやればよいのでは?
6
6
 
7
7
  (面倒だけど効率をとるか、簡単だけど非効率をとるか)
8
+
9
+
10
+
11
+ # 調整
12
+
13
+ ```SQL
14
+
15
+ CREATE TABLE test_journals (
16
+
17
+ company_id CHAR(43) NOT NULL,
18
+
19
+ journal_id INT NOT NULL,
20
+
21
+ account_id CHAR(6),
22
+
23
+ amount BIGINT,
24
+
25
+ PRIMARY KEY (company_id, journal_id, account_id)
26
+
27
+ ) DEFAULT CHARSET=utf8;
28
+
29
+
30
+
31
+ CREATE TABLE test_trial_balances (
32
+
33
+ company_id CHAR(43) NOT NULL,
34
+
35
+ account_id CHAR(6),
36
+
37
+ total_amount BIGINT,
38
+
39
+ PRIMARY KEY (company_id, account_id)
40
+
41
+ ) DEFAULT CHARSET=utf8;
42
+
43
+
44
+
45
+ /* ここまで提示の通り */
46
+
47
+ ```
48
+
49
+ 以下ちょっと手抜き(特にidを指定せずに全更新)
50
+
51
+ プロシージャ作成
52
+
53
+ ```SQL
54
+
55
+ drop procedure if exists mod_balances;
56
+
57
+ delimiter //
58
+
59
+ create procedure mod_balances()
60
+
61
+ begin
62
+
63
+ insert into test_trial_balances
64
+
65
+ select company_id,account_id,sum(amount) from test_journals
66
+
67
+ group by company_id,account_id
68
+
69
+ on duplicate key update total_amount=values(total_amount);
70
+
71
+ end
72
+
73
+ //
74
+
75
+ delimiter ;
76
+
77
+ ```
78
+
79
+ test_trial_balancesにダミーデータを入れておく
80
+
81
+ ```SQL
82
+
83
+ INSERT IGNORE INTO test_trial_balances VALUES
84
+
85
+ ('X','aaa',150),
86
+
87
+ ('X','bbb',100);
88
+
89
+ ```
90
+
91
+
92
+
93
+ test_journalsにデータ投入して、その後更新プロシージャを走らせる
94
+
95
+ ```SQL
96
+
97
+ INSERT IGNORE INTO test_journals VALUES
98
+
99
+ ('X','1','aaa',100),
100
+
101
+ ('X','2','aaa',200),
102
+
103
+ ('X','3','aaa',-150),
104
+
105
+ ('X','1','bbb',300),
106
+
107
+ ('X','2','bbb',400),
108
+
109
+ ('Y','1','aaa',500);
110
+
111
+ call mod_balances();
112
+
113
+ ```