SQLのSELECT文でOracle Database抽出しようとしています。
下記の場合の抽出方法が分かりません。
内容は3つのテーブルがあります。
【製品構成テーブル】と【品名テーブル】と【所要テーブル】の3種類です。
【製品構成テーブル】
フィールドは2つで”CODE”と”KCODE”です。
CODEは商品品番、KCODEはその商品の構成部品のイメージです。
CODE KCODE
A123 C45
A123 D46
A123 E47
B132 G67
B132 C45
B132 E47
【品名テーブル】
フィールドは2つで”CODE”と”NAME”です。
CODEは商品品番、構成部品、全てのコードが入っています。
NAMEはそれぞれの名前です。
CODE NAME
A123 テレビ
B132 プレーヤー
C45 抵抗
D46 コンデンサ
E47 LED
G67 トランジスタ
【所要テーブル】
フィールドは2つで”CODE”と”NAME”です。
CODEは商品品番、構成部品、全てのコードが入っています。
SHOYOUはそれぞれの消費数です。
KUBUNは仕様区分です。
CODE SHOYOU KUBUN
A123 100 A
A123 10 J
A123 20 T
B132 66 J
B132 50 J
C45 300 A
C45 200 B
D46 400 J
E47 500 Q
G67 900 T
G67 400 F
★それぞれのテーブルを結合し下記のように抽出したいです。
分からない事は"SHOYOU"と"KUBUN"繋げ方なのですが、
条件があります。
CODEに対するKUBUN は『J』か『T』のみを抽出、さらにその中でSHOYOUの最大値を抽出したいです。
CODE NAME KCODE NAME SHOYOU KUBUN
A123 テレビ C45 抵抗 10 J
A123 テレビ D46 コンデンサ 10 J
A123 テレビ E47 LED 10 J
A123 テレビ C45 抵抗 20 T
A123 テレビ D46 コンデンサ 20 T
A123 テレビ E47 LED 20 T
B132 プレーヤー G67 トランジスタ 66 J
B132 プレーヤー C45 抵抗 66 J
B132 プレーヤー E47 LED 66 J
品名テーブルを別名でH1、H2としています。
SELECT 製品構成テーブル.CODE , H1.NAME , 製品構成テーブル.KCODE , H2.NAME, 所要テーブル.SHOYOU, 所要テーブル.KUBUN
FROM 製品構成テーブル
LEFT JOIN 品名テーブル H1 ON 製品構成テーブル.CODE = H1.CODE
LEFT JOIN 品名テーブル H2 ON 製品構成テーブル.KCODE = H2.CODE
LEFT JOIN 所要テーブル ON 製品構成テーブル.CODE = 所要テーブル.CODE
VBAのADODB.ConnectionオブジェクトとSQL文を使ってエクセルにデータ抽出しようとしています。
実際のコードとテーブル名を記載します。
品名テーブル・・XHEAD
製品構成テーブル・・XPRTS
所要テーブル・・XSACT
Dim strSQL As String strSQL = "select XPRTS.CODE,H1.NAME,XPRTS.KCODE,H2.NAME,XSACT.SHOYOU,XSACT.KUBUN" strSQL = strSQL & " from XPRTS" strSQL = strSQL & " left join XHEAD H1 on XPRTS.CODE = H1.CODE" strSQL = strSQL & " left join XHEAD H2 on XPRTS.KCODE = H2.CODE"
条件文のCODEに対するKUBUNの『J』、『T』のみでさらにその中でCODEに対する最大値の抽出が
分かりません。
コードを教えて下さい。
追記コードです。
Dim strSQL As String Dim fild1, fild2, fild3, fild4, fild5 As String Dim wTbl,wTbl5 As String fild1 = "CODE" fild2 = "NAME" fild3 = "KCODE" fild4 = "KUBUN" fild5 = "SHOYOU" strSQL = "select tmp.CODE,tmp.NAME,tmp.KCODE,tmp.KNAME,tmp.KUBUN,tmp.SYOYOU" strSQL = strSQL & " from (select " & wTbl & "." & fild1 & " CODE,H1." & fild2 & " NAME," & wTbl & "." & fild3 & " KCODE,H2." & fild2 & " KNAME," & wTbl5 & "." & fild4 & " KUBUN," & wTbl5 & "." & fild5 & " SHOYOU" strSQL = strSQL & ", MAX(" & wTbl5 & "." & fild5 & ") OVER(PARTITION BY " & wTbl & "." & fild1 & "," & wTbl5 & "." & fild4 & ") MAX_SHOYOU" strSQL = strSQL & " from " & wTbl strSQL = strSQL & " left join " & wTbl2 & " H1" strSQL = strSQL & " on " & wTbl & "." & fild1 & " = H1." & fild1 strSQL = strSQL & " left join " & wTbl2 & " H2" strSQL = strSQL & " on " & wTbl & "." & fild3 & " = H2." & fild1 strSQL = strSQL & " left join " & wTbl5 strSQL = strSQL & " on " & wTbl & "." & fild1 & " = " & wTbl5 & "." & fild1 & " and " & wTbl5 & "." & fild4 & " in ('J','T')) tmp" strSQL = strSQL & " where tmp.SHOYOU = tmp.MAX_SHOYOU "
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/04/26 01:15
2017/04/26 01:31
2017/04/26 03:04
2017/04/26 04:18
2017/04/26 06:28
2017/04/26 08:54 編集
2017/04/26 09:50
2017/04/26 15:00
2017/04/27 00:20