|
こんばんは。
亀レスですけど
SQLで総計計算をおこなう方法をご紹介しますね。
ただ、データが10万件ということなので
複雑なクエリになると遅くて実用に耐えない可能性が高いため、
簡単なUPDATE文の発行で済むように 設計で工夫します。
まずは更新対象のテーブルを
CREATE TABLE tbl (
grp_num INT
, sub_num INT
, 品番 VARCHAR( 10 )
, 数 INT
, concat VARCHAR( 255 )
, total INT
, CONSTRAINT pk_tbl PRIMARY KEY ( grp_num, sub_num )
) ;
↑のようなフィールド構成にします。
■データ例
grp_num sub_num 品番 数 concat total
-------------------------------------------
1 1 A 2 Null Null
1 2 B 2 Null Null
1 3 C 3 Null Null
2 1 D 1 Null Null
2 2 E 2 Null Null
2 3 F 2 Null Null
3 1 A 3 Null Null
3 2 B 3 Null Null
3 3 W 3 Null Null
ポイントとしては、3つ。
★1つ目
同じ品番が繰り返し出てくるようなので
グループキーを作ること。
( 上記例では grp_num が該当 )
★2つ目
同グループの中で抜けの無い連番を振ること。
いわゆる枝番ですね。
( 上記例では sub_num が該当 )
★3つ目
品番を | で結合した キー項目
及び
数を掛け合わせる 総計
のフィールドは初期値を Null にしておきます。
( 上記例では concat と total が該当 )
# YU-TANGさん、雅さん、247bさんと
# 発言がカブッてる点はご容赦下さいね。(^_^A;;
■SQL
-------------------------------------------------------------------------------
UPDATE tbl T1
LEFT JOIN tbl T2
ON T1.grp_num = T2.grp_num And
T1.sub_num = T2.sub_num + 1
SET T1.total = IIf( T2.grp_num Is Null, T1.数, T2.total * T1.数 )
, T1.concat = IIf( T2.grp_num Is Null, T1.品番, T2.concat & '|' & T1.品番 ) ;
-------------------------------------------------------------------------------
■結果
grp_num sub_num 品番 数 concat total
-------------------------------------------
1 1 A 2 A 2
1 2 B 2 A|B 4
1 3 C 3 A|B|C 12
2 1 D 1 D 1
2 2 E 2 D|E 2
2 3 F 2 D|E|F 4
3 1 A 3 A 3
3 2 B 3 A|B 9
3 3 W 3 A|B|W 27
以下、おまけ。
外部結合 は 内部結合 に比べて
パフォーマンスがめちゃんこ悪いので
先のSQLで 更新速度 が遅すぎる場合は
UPDATE文を2回に分けて発行します。
▼1回目
------------------------------
UPDATE tbl
SET concat = 品番, total = 数
WHERE sub_num = 1 ;
------------------------------
▼2回目
--------------------------------------------
UPDATE tbl T1
INNER JOIN tbl T2
ON T1.grp_num = T2.grp_num And
T1.sub_num = T2.sub_num + 1
SET T1.total = T2.total * T1.数
, T1.concat = T2.concat & '|' & T1.品番 ;
--------------------------------------------
では ☆
|
|