パラメータークエリ?というのを使って実行時エラー3601から抜け出したい


Accessで、Excelにデータを書き込むプログラムを動かしていますと、

---------------
実行時エラー"3601":
パラーメーターが少なすぎます。1を指定してください
--------------

というエラーが出てきまして、一向に希望通りの処理が行われず…。
調べますと、ある変数に格納された下記のSQL文。

-----------------------
select b.都道府県,count(B.都道府県) as 店舗実績
from(select a.都道府県,
       a.担当者
 from(select 都道府県,
       担当者ID as 担当者
      sum(目標値)/10 as ksum
  from 概要テーブル
   where 更新日 between 200401 and 200430
   group by 都道府県,担当者ID
      union all
select 都道府県
   ,担当者
   ,sum(契約件数) as ksum
   from 契約詳細テーブル
    where 更新日 between 200401 and 200430
    group by 都道府県
         ,募集者
) as a
group by a.都道府県,
     a.募集者
having sum(a.ksum) >= 0.5
) as b
group by b.都道府県
order by b.都道府県
------------------------

これに何か原因があるのでは?と考え、ネット上で色々と調べました。

回答の条件
  • 1人20回まで
  • 登録:
  • 終了:2020/03/24 07:54:26
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。
id:moon-fondu

(1)1885-1 | パラメータが少なすぎます。 - VB初心者友の会 - Q&A掲示板過去ログ

http://www.gizcollabo.jp/vbtomo/log/archive/vbqanda_1885_1.html

にありますように、where句の後の「更新日」の型が数値型なのがいけないのか?等と考えたりしましたが、

これを文字列型にすると別のエラーのダイアログが出てきたので、検討違いのようでした。

そしてさらに調べますと、

(2)パラメータクエリを含むSQLをVBAから実行する - hatena chips

https://hatenachips.blog.fc2.com/blog-entry-478.html

にありますように、パラメータークエリが存在するのが原因ではないかと考えまして。

上記SQLだけをAccessのクエリデザインで実行してみますと、「パラメーターの入力」というダイアログが出てきて、

------------

契約件数

(テキストボックス)

------------

が出てきます。つまり上記SQL内の「sum(契約件数)」という箇所の"契約件数"という項目に原因があるのでは?と推測したのですが。

(2)の記事を参考にしても、SQL文をどのように修正したら、3601エラーが解消できるのか、応用ができず…具体的にどうすればエラーから抜け出せるか、お知恵をお貸しいただければ幸いです。

よろしくお願い致しますm(__)m

ベストアンサー

id:a-kuma3 No.2

回答回数4974ベストアンサー獲得回数2154

ポイント1000pt

質問の補足を受けて、確認してみました。

まず、これ。

最初の質問とエラー内容が変わってきておりますが…「演算子がありません」と出てきてしまいました。
下記のクエリを実行しようとした際です(ファイル内にはクエリとして保存されてないですが)。


多分、補足に貼りつけたままの SQL で実行していると思うのですが、インデントに全角の空白を使っているのがダメです。
半角の空白に置き換えると、最初の質問通りに、

上記SQLだけをAccessのクエリデザインで実行してみますと、「パラメーターの入力」というダイアログが出てきて

の状態になります。

これの原因は、「契約詳細テーブル」に、「契約件数」という列が無いからです。
勝手に想像するに、契約件数は担当者ごとに契約を取った件数でしょうから、こんな感じの SQL になるのではないかと思います。

select b.都道府県,count(B.都道府県) as 店舗実績
from(select a.都道府県,a.担当者
  from(select 都道府県,担当者ID as 担当者,sum(目標値)/10 as ksum
    from 概要テーブル
      where 更新日 between 200401 and 200430
      group by 都道府県,担当者ID
            union all
select 都道府県,担当者,count(担当者) as ksum
      from 契約詳細テーブル
        where 更新日 between 200401 and 200430
        group by 都道府県,担当者) as a
group by a.都道府県,a.担当者
having sum(a.ksum) >= 0.5) as b
group by b.都道府県
order by b.都道府県;

これで、とりあえずエラーはなくなります。
結果として抽出したデータに意味があるかどうかは、ちょっと疑問な感じはしますが。

id:moon-fondu

そうだったんですね、ありがとうございます。
確かにテーブルには「契約件数」という列がなく、これを実際に存在する列名にSQLを修正すると、プログラム全体でも「実行時エラー"3601":」は回避できました!
ありがとうございます(^^)

2020/03/24 07:49:42

その他の回答1件)

id:chsm No.1

回答回数33ベストアンサー獲得回数5

ポイント100pt

中に書いてる0.5が原因です。
別の数字に変更しろという意味だと思います。

他3件のコメントを見る
id:moon-fondu

chsmさん失礼しました、再度テーブルが入っているファイルをアップしました。

2020/03/19 07:24:08
id:chsm

ファイルを確認したら、何かの列が欠けているようです。

2020/03/22 08:26:25
id:moon-fondu

皆さま、失礼しました。テーブルをこちら https://xfs.jp/mJk9Wn にアップしましたので、よかったら再度、ご確認いただけますと幸いです<m(__)m>

「概要テーブル」と「契約詳細テーブル」が入ってます。

最初の質問とエラー内容が変わってきておりますが…「演算子がありません」と出てきてしまいました。

下記のクエリを実行しようとした際です(ファイル内にはクエリとして保存されてないですが)。

--------------------------------------

select b.都道府県,count(B.都道府県) as 店舗実績

from(select a.都道府県,a.担当者

 from(select 都道府県,担当者ID as 担当者,sum(目標値)/10 as ksum

  from 概要テーブル

   where 更新日 between 200401 and 200430

   group by 都道府県,担当者ID

      union all

select 都道府県,担当者,sum(契約件数) as ksum

   from 契約詳細テーブル

    where 更新日 between 200401 and 200430

    group by 都道府県,担当者) as a

group by a.都道府県,a.担当者

having sum(a.ksum) >= 0.5) as b

group by b.都道府県

order by b.都道府県;

--------------------------------------

契約詳細テーブルに「契約件数」という列がないからでしょうか…でもテーブルを見ると、その列はやはり見当たらないような…もう1度、確認します。

id:a-kuma3 No.2

回答回数4974ベストアンサー獲得回数2154ここでベストアンサー

ポイント1000pt

質問の補足を受けて、確認してみました。

まず、これ。

最初の質問とエラー内容が変わってきておりますが…「演算子がありません」と出てきてしまいました。
下記のクエリを実行しようとした際です(ファイル内にはクエリとして保存されてないですが)。


多分、補足に貼りつけたままの SQL で実行していると思うのですが、インデントに全角の空白を使っているのがダメです。
半角の空白に置き換えると、最初の質問通りに、

上記SQLだけをAccessのクエリデザインで実行してみますと、「パラメーターの入力」というダイアログが出てきて

の状態になります。

これの原因は、「契約詳細テーブル」に、「契約件数」という列が無いからです。
勝手に想像するに、契約件数は担当者ごとに契約を取った件数でしょうから、こんな感じの SQL になるのではないかと思います。

select b.都道府県,count(B.都道府県) as 店舗実績
from(select a.都道府県,a.担当者
  from(select 都道府県,担当者ID as 担当者,sum(目標値)/10 as ksum
    from 概要テーブル
      where 更新日 between 200401 and 200430
      group by 都道府県,担当者ID
            union all
select 都道府県,担当者,count(担当者) as ksum
      from 契約詳細テーブル
        where 更新日 between 200401 and 200430
        group by 都道府県,担当者) as a
group by a.都道府県,a.担当者
having sum(a.ksum) >= 0.5) as b
group by b.都道府県
order by b.都道府県;

これで、とりあえずエラーはなくなります。
結果として抽出したデータに意味があるかどうかは、ちょっと疑問な感じはしますが。

id:moon-fondu

そうだったんですね、ありがとうございます。
確かにテーブルには「契約件数」という列がなく、これを実際に存在する列名にSQLを修正すると、プログラム全体でも「実行時エラー"3601":」は回避できました!
ありがとうございます(^^)

2020/03/24 07:49:42
  • id:a-kuma3
    対象にしている「概要テーブル」と「契約詳細テーブル」に、それぞれ、どんな列があるのかが分からないと、誰も答えられません。
    補足から、契約詳細テーブルに契約件数という列はあるのかな、とか、募集者って列も臭いなとか、実際にエラーが出てるSQLと同じなのか置き換えてるのをミスったのか、とか、想像で書くことはできますが。
  • id:ken3memo
    テーブル構造とデータが無いと、私も想像妄想回答になってしまうのですが、

    >>
    elect 都道府県
       ,担当者
       ,sum(契約件数) as ksum
       from 契約詳細テーブル
        where 更新日 between 200401 and 200430
        group by 都道府県
             ,募集者
    ) as a
    <<

    少し気になったのが、日付の表現かなぁ
    where 更新日 between 200401 and 200430
    ↑20 04 01 ~ 20 04 30 の表現がなんか、引っかかるなぁ・・・

    過去の質問でもあったと思うのですが
    https://q.hatena.ne.jp/1569654927
    日付は #2020/03/13# など、#で囲って表現します

    access 更新日 between で検索すると
    https://accessvba.blog.ss-blog.jp/2014-10-01
    などが見つかり
    >>
     日付のみの「T日時A」テーブルに対して、条件
    WHERE T日時A.日付 Between #2014/3/15# And #2014/3/17#
     で、抽出を行うと、
    <<

    としています。

    テーブルの項目名と使用中のテストデータを書くと、
    適切な回答が付くと思います。( 五本の指くらいは過疎った人力検索でも回答者が居ると思う ぉぃぉぃ)
  • id:ken3memo
    更新日を日付型だと名前から決めつけてコメントしましたが、
    数値で管理して範囲選択させている場合もあるので、日付型 #を試すよりも、
    しつこいですが、テーブルのデータ型・構造を書くと、適切な回答が付くと思います・・
  • id:moon-fondu
    >a-kuma3さん
    すみません、質問に記載したSQLに誤りがありました。募集者、ではなく「担当者」です。
    また「担当者ID」列はありますが、「担当者」列はないです(別名のため)。
    テーブルの情報、失礼しました。追って掲載致します。

    >ken3memoさん
    過疎っているんですか。
    でも一番、人力検索が専門性の高いご回答をしてくださる印象で、頼りにしてます!
    わかりにくい質問で恐れ入ります。
    テーブルの項目名、データ型、併せて載せます。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません