3テーブルよりを以下の条件で1つのSELECT文で抽出したいのですが可能でしょうか?
・C_TBLのDATEが2007のデータ〔SUBSTR(DATE,1,4)='2007'を使用?〕
・A_TBLのCORPがcorp1のデータ(あいまい検索)
・CORP(昇順)、DATE(降順)、ITEM(昇順)でソート
・表示カラムは、CORP・DATE・ITEM・SURYO・TANKAです
<<A_TBL>> <<B_TBL>> <<C_TBL>>
A CORP B A ITEM TANKA C A B DATE SURYO
a01 corp11 b01 a02 item03 10 c01 a03 b06 2007-11-01 100
a02 corp13 b02 a03 item01 20 c02 a01 b03 2007-12-01 200
a03 corp11 b03 a01 item03 10 c03 a05 b04 2007-11-01 100
a04 corp05 b04 a05 item02 30 c04 a01 b05 2007-11-01 300
a05 corp13 b05 a01 item02 30 c05 a03 b06 2007-12-01 200
b06 a03 item03 20 c06 a01 b05 2007-11-02 100
b07 a01 item01 10 c07 a03 b02 2007-11-01 500
また、以下の条件で集計を1つのSELECT文で行えますか?
現在は、C_TBLとB_TBLで集計抽出し、A_TBLの対象データを抽出し、2つの配列より・・・
というロジックを組んでいます。
・C_TBLのDATEが2007のデータ〔SUBSTR(DATE,1,4)='2007'を使用?〕
・A_TBLのCORPがcorp1のデータ(あいまい検索)
・CORP(昇順)、DATE(降順)でソート ※DATEは年月のみです
・CORP、DATE(年月)毎で金額を集計〔SUM(C_TBL.SURYO*B_TBL.TANKA) AS KINGAKU〕
・表示カラムは、CORP・DATE・金額です
宜しくお願い致します。
No.1ベストアンサー
- 回答日時:
前者が・・・
SELECT `CORP`,`DATE`,`ITEM`,`SURYO`,`TANKA`
FROM `C_TBL`
INNER JOIN `B_TBL` ON `B_TBL`.`B` = `C_TBL`.`B`
INNER JOIN `A_TBL` ON `A_TBL`.`A` = `C_TBL`.`A`
AND `A_TBL`.`CORP` REGEXP("corp1")
WHERE 1
AND `C_TBL`.`DATE` BETWEEN '2007-01-01' AND '2007-12-31'
ORDER BY `CORP` ASC,`DATE` DESC,`ITEM` ASC
後者が・・・
SELECT `CORP`,`DATE`,SUM(`SURYO`*`TANKA`) AS `KINGAKU`
FROM `C_TBL`
INNER JOIN `B_TBL` ON `B_TBL`.`B` = `C_TBL`.`B`
INNER JOIN `A_TBL` ON `A_TBL`.`A` = `C_TBL`.`A`
AND `A_TBL`.`CORP` REGEXP("corp1")
WHERE 1
AND `C_TBL`.`DATE` BETWEEN '2007-01-01' AND '2007-12-31'
GROUP BY `CORP`,`DATE`
ORDER BY `CORP` ASC,`DATE` DESC
なお、日付にSUBSTR()だとインデックスが無効になるはずなので
レンジ(BETWEEN)で指定しています
また、あいまい検索は正規表現(REGEXP())でやれますが、
これもインデックスが利かないのであまり有効ではないかもしれません
LIKE '%corp1%'でも同じです。前方一致もしくは後方一致なら
インデックスが有効です。
適切なインデックスをつければデータが多くてもスピードはあまり
落ちないで運用できそうですね
早速の御回答有難う御座います。
詳細な処理ですと、DATEの抽出条件は
・年月(2007-11)で抽出
・年だけ(2007)で抽出
・月(11)だけで抽出
の3パターンがあり、月だけのパターンがあるので統一してSUBSTRを使用していました。他によい方法があれば教えていただきたいのですが。
また、WHERE1を初めてみたのですが、WHEREと違うのでしょうか?少しネットで調べてみましたが、検索できませんでした。
宜しければご回答お願い致します。
No.2
- 回答日時:
・年月(2007-11)で抽出
`DATE` BETWEEN '2007-11-01' AND '2007-11-30'
・年だけ(2007)で抽出
`DATE` BETWEEN '2007-01-01' AND '2007-12-31'
もしくは
YEAR(`DATE`)='2007'
・月(11)だけで抽出
MONTH(`DATE`)='11'
YEAR()やMONTH()でもインデックス自体はきくようです。
レンジの方がはやいような気がします
WHERE 1ってのは条件をすべてANDでつないで書くときのおまじないです
「ここからWHERE句ですよ」という宣言みたいなもんだと思ってください。
PHPなどのプログラムで条件を動的に設定するときなどにつかいます。
実際なにも条件を設定しなくてもWHERE 1(すなわちWHERE TRUE)で
すべての情報が検索されますのでプログラム処理がらくです。
(phpMyAdminではWHERE 1がデフォルトで表示されます)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAチェックボックスで有効無効切り替えできるように 5 2022/10/21 16:13
- Visual Basic(VBA) フォーム上のリストボックスに重複して表示しています 3 2022/10/19 11:55
- Visual Basic(VBA) VBAコードで質問があります 2 2022/10/20 15:27
- Visual Basic(VBA) VBA チェックボックスの設定について 1 2022/10/24 10:27
- Perl RSSにdiv,ul classを付けたいのですがどのようにつけるのかわからないです 2 2022/03/28 01:53
- Visual Basic(VBA) このマクロの説明文を教えてほしいです。 1 2023/01/12 09:17
- Visual Basic(VBA) データベースから絞り込んでデータを読み込み 1 2023/02/21 19:51
- その他(プログラミング・Web制作) python 気象データの取得 2 2023/06/20 23:54
- その他(プログラミング・Web制作) pythonのpandasのcsvの外部結合(outer_join)した際に列が想定とは異なる事象 1 2022/05/25 13:23
- PHP PHPSpreadsheetを使って関数を繰り返し埋め込みたい 1 2023/05/24 11:33
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
オートインクリメントについて
-
インデックスについて
-
SQLです!!教えてください。
-
INDIRECT関数の代替方法は?
-
now()かCURRENT_TIMESTAMPか
-
SELECT文で、指定カラム以外の...
-
BULK INSERT時のNull許容について
-
DBの定義のサイズを大きくし過...
-
MYSQLで小数点を表示する場合と...
-
PL/SQLでの文字列比較
-
type date にnullをinsert
-
LIKEの右側にカラムを指定でき...
-
コンボボックスの抽出条件のLik...
-
MYSQLのストアドでの動的SQLに...
-
時間範囲が重複したレコードを...
-
以下の式の後の部分のMySQLのSQ...
-
End Ifに対応するIfブロックが...
-
最大2147483647なのに何故int(1...
-
DBエラーの意味
-
ROUND関数で、四捨五入ができな...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ユニーク制約とユニークインデ...
-
MySQLのKey属性「MUL」について
-
複数カラム検索で、LIKE "%検索...
-
データベースの設計について教...
-
インデックスを張るべき項目に...
-
インデックスについて
-
UPDATEつてインデックス貼って...
-
削除ふらぐ
-
SQL Server Management Studio...
-
3テーブルより抽出のSQL文
-
MySQLのauto incrementについて
-
INDIRECT関数の代替方法は?
-
一部のカラムでdistinctし全て...
-
SQLServerでNULLを挿入したいです
-
テーブルの列数を調べたい
-
SELECT文で、指定カラム以外の...
-
DBの定義のサイズを大きくし過...
-
now()かCURRENT_TIMESTAMPか
-
LIKEの右側にカラムを指定でき...
-
UNIONする際、片方テーブルしか...
おすすめ情報