VBAでSQLでデータベースから指定範囲内のデータを取得する方法

このQ&Aのポイント
  • VBAとSQLを使って、Oracleデータベースから指定範囲内のデータを取得する方法について教えてください。
  • データベースから取得したデータをエクセルに吐き出すときに、範囲内の数字がない場合には0と表示する方法についても教えてください。
  • また、データベースのテーブルの結合時に、decodeやRIGHT JOINを使用する方法についても教えてください。
回答を見る
  • ベストアンサー

VBAでSQL

VBAでSQL データベースはOracle データ 20100723 3個 20100729 4個 20100730 1個 決めた範囲内でデータを取得するとき数字がない時は 20100724は0個にしたいのですが どうしたらいいのでしょうか? mSQL = mSQL & "AND (j.hanbai_dt BETWEEN 20100723 And 20100724 " & vbCrLf mSQL = mSQL & "or j.hanbai_dt BETWEEN 20100729 And 20100730 )" & vbCrLf エクセルに吐き出すときは 20100723 3 20100724 0 20100729 4 20100730 1 decode RIGHT JOIN とか使うことは分かるんですがどう使うか分からないのです。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

こんにちは。 SELECT C.日付, M.個数(カラム名がわかりません・・・) FROM (SELECT TO_DATE(開始日,'yyyymmdd') + COUNTER - 1 AS 日付 FROM (SELECT 20100701 AS 開始日, 20100731 AS 終了日 FROM DUAL) A, (SELECT ROWNUM AS COUNTER FROM ALL_CATALOG) B WHERE B.COUNTER <= 終了日 - 開始日 + 1) C LEFT OUTER JOIN データ(これはテーブル名?) M ON(M.hanbai_dt = C.日付) ORDER BY 日付 とかでどうですかね? (ALL_CATALOGは便宜上です・・・) ちょっと今、Oracleが手元にないんで、動かんかったら言ってください・・・。 (エラーの箇所を教えてね)

okwave1322
質問者

お礼

ありがとうございます。 試してみます

その他の回答 (2)

回答No.2

こんにちは。 日付の連番だけを持った、下記のようなテーブルがありますか? または作成しますか? 20100701 20100702 : 20100731 これだと単純に外部結合でおしまいです。 これがないと、ちょっと複雑になりますが、どっちがいいですか?

okwave1322
質問者

お礼

返事ありがとうございます。 日付の連番のテーブルはありません。作成もしないで作ろうと思っていました。

回答No.1

こんにちは。 ちょっとわかりませんが、 20100725 20100726 20100727 20100728 は、いらないんですか?

okwave1322
質問者

お礼

ほしいです

関連するQ&A

  • SQL初心者なので教えてください。

    毎度ここにお世話になっております。 売上詳細という表の中にNOとSYOHIN_CDの列があるとします。 Noは1~10まであり、SYOHIN_NAMEにはNo6の列だけ文字が入っています。 ここで、No1~N5はSHYOHIN_NAMEはNULLで、No6~No10のいずれかのSYOHIN_NAMEに文字が入っている物を検索するにはどうしたらいいでしょう? SELECT * FROM hanbai.売上 AA where EXISTS (select * from hanbai.売上詳細 BB where BB.NO between 1 and 5 and SYOHIN_NAME is null and BB.NO between 6 and 10 and SYOHIN_NAME is not null); 構文間違っているので表示されませんが・・・ちゃんと表示されるSQLを教えてください。お願いします。オラクルです。 説明がおかしくてわかりづらいと思いますが、補足しますのでよろしくおねがいします。

  • VBAエクセルシートの値をIN句

    いつもお世話になっております。 エクセルで、オラクルDBから、特定の商品の販売数を取得するVBAを作ったのですが、集計したい商品がまれに変更になります。 出来れば、エクセルシート「抽出リスト(仮名)」のリストの値を抽出できるようにするにはどういったSQLを書けばよいでしょうか? 【テーブル構成(FRT_ITEM)】 ITM000:取消フラグ ITM050:販売日 ITM150:科目CD ITM160:科目名(商品名) ITM200:販売数量 現在のSQL文 stSQL = "SELECT " & vbCrLf stSQL = stSQL & "ITM050 AS 販売日," & vbCrLf stSQL = stSQL & "ITM150 AS 科目CD," & vbCrLf stSQL = stSQL & "ITM160 AS 科目名," & vbCrLf stSQL = stSQL & "SUM(ITM200)AS 個数" & vbCrLf stSQL = stSQL & "FROM FRT_ITEM" & vbCrLf  ’キャンセルフラグ除外 stSQL = stSQL & "WHERE ITM000 = 0" & vbCrLf ↓ここから科目CDによって商品抽出 '商品Aグループ stSQL = stSQL & "AND ITM050 = '" & DT & "'" & vbCrLf stSQL = stSQL & "AND ITM150 BETWEEN '1600' AND '1610'" & vbCrLf '商品B stSQL = stSQL & "OR ITM050 = '" & DT & "'" & vbCrLf ↑ ここまで stSQL = stSQL & "AND ITM150 BETWEEN '1521' AND '1521'" & vbCrLf stSQL = stSQL & "GROUP BY ITM050,ITM150,ITM160" & vbCrLf stSQL = stSQL & "ORDER BY ITM050,ITM150,ITM160" ※変数DT:販売日 この状態だと、抽出する商品が変わるごとに、SQL文を修正する必要があるため、別シート「抽出リスト(仮名)」に抽出する商品CD一覧を記載し抽出出来ないかと考えております。 多分、IN句を使い、抽出リストシートを呼べれば良いのではと考えておりますが、書き方が分かりません。 ※商品の数は、最大30種類程度となります。 また、テーブル(FRT_ITEM)は500万レコード以上あるため、IN句をつかってのテーブル総なめ抽出はDBへの負荷が心配です。 アドバイスを頂けましたら幸いです。

  • ExcelVBAでのOracleデータベースへのSQL文発行

    Excelにデータベースのデータ構造を書いたファイルがあります。 それをVBAでOracleに直接SQL文を発行してテーブルを作成したいのですが、VBみたいにoo4oをつかって、Oracleに接続することは可能ですか? カテゴリーが違うかもしれませんが、ここで聞いたほうがわかるとおもったので、質問させてもらいました。 よろしくおねがいします。

  • VB.NETのSQL文について

    質問失礼します。 VB、SQLともに勉強しはじめて日が浅い初心者ですが、どなたかお力をお貸しください。 データベースに登録しているデータをNPOIを使って、出力したいと考えています。 DataTableを使用して作りましたが、上手くできない部分があります。 テーブルのカラムは、社員番号、事務物販名、登録数、登録日、更新日のようなものが入っているイメージです。 登録日を検索して、全てのテーブルを抽出したいのですが、○月○日〜○月○日にデータを登録した人というときに、つまづいてしまいました。 SQL.Append("SELECT " ) ・ ・ SQL.Append("WHERE ") SQL.Append(" 登録日 BETWEEN パラメータ1 AND パラメータ2 ) のように、書いたところ問題なく、出力されました。 パラメーターの部分は、DateTimePickerコントロールを配置して、日付を入力した値を設定しています。 2023/1/1 と 2023/1/2と2つ入力して、この2日間のデータを出そうとしたところ、1/1の文しか出力されませんでした。 原因は、データベースに入っているのは、Date型で、YYYY/MM/DD HH:mm:SS形式でした。 1/2の0時以降は、該当データに含まれないということは分かっているのですが、それを含めてのSQLの書き方がわかりません。 単純にSQLを書くには、 BETWEEN 2023/1/1 AND 2023/1/2 23:59:59 で、2日の文を抽出されますが、VBに書く時がうまくできない状態で、 時間の部分を、結合すれば良いのかと思い、 SQL.Append("SELECT " ) ・ ・ SQL.Append("WHERE ") SQL.Append(" 登録日 BETWEEN パラメータ1 AND パラメータ2 II '23:59:59' ") と、DataTimePickerから持ってきた、パラメータの日付に時間を結合してみたところ、ダメでした。 型の問題なのか、よくわからず、勉強している状態です。 基礎がなっておらず、初歩的なミスかと思いますが、ご指導ください。 データベースはOracleを使用しています。

  • SQLについて

    SQLについて質問です。 現在vbからmdbファイルにある日付間のデータを取得するようなsqlをなげているのですがうまくいかないのでお知恵をお貸しください、、、 sql文は ("select * from ABC where date between ""'" & hiniti & "'"" and ""'" & hiniti2 & "'"" ;") hinitiには日付(2006/4/5)hiniti2には(2006/7/4)のように日付が入ったとするとデータは2006/4/5以降から2006/7/4までしか取得してこないのです。 BETWEEN 演算子は境界値も含むらしいので2006/4/5のデータが取れない理由がわかりません。 日付が文字列というのが問題あるのでしょうか?

  • ACCESS VBAでSQL Server使用

    ACCESS VBAでSQL Server使用しています。 データ量が多い場合、 リンクテーブルを張ってDocmdでJetデータベースエンジンを使う方法と SQL ServerにADOで接続してT-SQLを使用する方法ではどちらが早いでしょうか?

  • Oracle(オラクル)で、日付時刻型の検索方法について

    質問させていただきます。 データベースはオラクルを使っていて、 SQL文で、抽出するときにエラーが出て困っています。 日付時刻型が「2005/05/26 19:13:00」という感じで入ってます。 2005/05/26 を抽出したいのですが、 BETWEEN '2005/05/26 00:00:00' AND '2005/05/26 23:59:59' だと、エラーでできません。 どなた様か、ご教授よろしくお願いしますm(_ _)m

  • SQLの条件文

    以下のデータで、dataで始まり、かつ数値部分を100~300の範囲で抽出したいと考えています。 テーブル名はtable1、フィールド名はretuです。 -retu- data023 unknowndata data105 data203 data827 SELECT retu FROM table1 WHERE retu LIKE 'data%' AND CAST(RIGHT(retu,3) AS Int) BETWEEN 100 AND 300 上記のSQLを作ってみたのですが、これだとunknowndataに対してCASTが行われてしまうらしく、CASTが失敗してデータを取り出すことができませんでした。 正しくデータを取り出すためには、どのように記述すれば良いでしょうか?

  • VBAからoracleに接続しSQLで日付絞込み

    かなりの素人で申し訳ありません。初心者です。 EXCEL2016を使用し、VBAからoracleに接続、日付のカラムを範囲指定して検索、excelに出力するツールを作成しています。 テーブル:注文テーブル 項目:注文番号、項番、納期 納期は日付型です。 注文番号を指定してデータの取得はできているのですが、納期を指定すると「実行時エラー ODBCドライバーは要求されたプロパティをサポートしていません」とエラーになります。日付指定の方法が違うのではと推測するも解決しません。ご教授頂けないでしょうか。 SQL = “SELECT 注文番号, 項番, 納期 FROM 注文テーブル WHERE 納期 BETWEEN #2021/01/01# AND #2021/01/31#;”

  • SQL文を教えてください

    初心者です。 SQL文を教えてください。 バージョンはOracle 9.2です。 SELECT LTRIM(TO_CHAR(SEQ_PB_TYOHYO.NEXTVAL,'00000000')) AS NO_TYOHYO ,TO_CHAR(SYSDATE,'YYMMDD') AS DT_SYORI ,TO_CHAR(SYSDATE,'HH24MISS') AS TM_SYORI ,UM.CD_TOKCOD ,TM.RN_TOKUI ,SUM(DECODE(HM.CD_HSYUCD,'000001',UM.SU_URIAGE)) ,SUM(DECODE(HM.CD_HSYUCD,'000001',UM.KN_URIAGE)) ,SUM(DECODE(HM.CD_HSYUCD,'000002',UM.SU_URIAGE)) ,SUM(DECODE(HM.CD_HSYUCD,'000002',UM.KN_URIAGE)) ,/* 以下省略(000012まである) */ From URIMEI UM ,TOKMAS TM ,HINMAS HM Where (UM.KB_NYURYO = 1 Or UM.KB_NYURYO = 3) And UM.KB_DATA = 1 And (UM.KB_URINYU = 1 Or UM.KB_URINYU = 2 Or UM.KB_URINYU = 3) And UM.DT_URINYU >= CONCAT(W_Date1,'01') And UM.DT_URINYU <= TO_CHAR(Last_Day(W_Date2),'YYMMDD') And UM.CD_TOKCOD = TM.CD_TOKCOD(+) And HM.CD_HSYUCD = UM.CD_HSYUCD(+) GROUP BY HM.CD_HSYUCD; SQLスクラッチパットにて実行すると 「ここでは順序番号は使用できません」と言うエラーメッセージが出ます。 で、上から5行消して実行すると実行結果が返ってくるのです。 こういう場合はどうしたらよろしいでしょうか?