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.都道府県
------------------------
これに何か原因があるのでは?と考え、ネット上で色々と調べました。
質問の補足を受けて、確認してみました。
まず、これ。
最初の質問とエラー内容が変わってきておりますが…「演算子がありません」と出てきてしまいました。
下記のクエリを実行しようとした際です(ファイル内にはクエリとして保存されてないですが)。
多分、補足に貼りつけたままの 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.都道府県;
これで、とりあえずエラーはなくなります。
結果として抽出したデータに意味があるかどうかは、ちょっと疑問な感じはしますが。
(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
中に書いてる0.5が原因です。
別の数字に変更しろという意味だと思います。
皆さま、失礼しました。テーブルをこちら 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度、確認します。
補足から、契約詳細テーブルに契約件数という列はあるのかな、とか、募集者って列も臭いなとか、実際にエラーが出てるSQLと同じなのか置き換えてるのをミスったのか、とか、想像で書くことはできますが。
>>
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#
で、抽出を行うと、
<<
としています。
テーブルの項目名と使用中のテストデータを書くと、
適切な回答が付くと思います。( 五本の指くらいは過疎った人力検索でも回答者が居ると思う ぉぃぉぃ)
数値で管理して範囲選択させている場合もあるので、日付型 #を試すよりも、
しつこいですが、テーブルのデータ型・構造を書くと、適切な回答が付くと思います・・
すみません、質問に記載したSQLに誤りがありました。募集者、ではなく「担当者」です。
また「担当者ID」列はありますが、「担当者」列はないです(別名のため)。
テーブルの情報、失礼しました。追って掲載致します。
>ken3memoさん
過疎っているんですか。
でも一番、人力検索が専門性の高いご回答をしてくださる印象で、頼りにしてます!
わかりにくい質問で恐れ入ります。
テーブルの項目名、データ型、併せて載せます。