質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Q&A

2回答

1161閲覧

Access SQL IIfが長すぎて更新、テーブル作成ができない

nyk.

総合スコア3

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

0グッド

0クリップ

投稿2022/05/07 03:55

編集2022/05/07 20:06

すいません、初心者な為記述がわかりにくかったら申し訳ありません。

複数ある管理番号の内、一番最後のカラムに入力された管理番号を「最終管理番号」に取得したいです。

【抽出結果】

開始日ロット番号最終管理番号管理番号①管理番号②管理番号③管理番号④管理番号⑤
2022/04/25 12:40:006017410000160290020001473300100016029002
2022/04/26 12:00:0060159100001471700300014717003
2022/04/27 21:30:00600311000016459004000156680020001566800100016459004
2022/04/28 8:00:005344770C2116347017C2116347017
2022/04/28 14:50:005683670C2200123060C2200064066C2200123060
2022/04/28 10:30:00585689020220427002202204150192022042700120220427002

上記の「抽出結果」の内、最終的には「開始日」「ロット番号」「最終管理番号」のみのテーブルを作成(例:T00_test)し、別のテーブルとのクエリに利用したく考えています。

そこで
①以前作っていたテーブル(例:T00_test)の中身を削除、
②更新クエリにて新たに取得した内容(上記結果の内、「開始日」を「2022/04/28」のみに条件付けした上で)を反映
しようと考えました。

ところが「更新クエリ」を実行した所で画像のようなエラーが出ました。
(IIf(IsNull([t10_0361],~が見つかりません。パラメータや別名が正しいこと、無効な文字や区切り記号が含まれていないこと、また名前が長すぎないことを確認して下さい)
イメージ説明

※参考として、そのときの「SQLビュー」での文を載せておきます。
【SQL文】

SELECT     t10_seijs1.t10_0310 AS 開始日     , t10_seijs1.t10_0170 AS ロット番号     , IIf(IsNull([t10_0361]),[t10_0360]       ,IIf(IsNull([t10_0362]),[t10_0361]         ,IIf(IsNull([t10_0363]),[t10_0362]           ,IIf(IsNull([t10_0364]),[t10_0363],[t10_0364])))) AS 最終管理番号     , t10_seijs1.t10_0360 AS 管理番号①     , t10_seijs1.t10_0361 AS 管理番号②     , t10_seijs1.t10_0362 AS 管理番号③     , t10_seijs1.t10_0363 AS 管理番号④     , t10_seijs1.t10_0364 AS 管理番号⑤ FROM    t10_seijs1 WHERE     (((t10_seijs1.t10_0310) Like "2022/04/28*")) ORDER BY     t10_seijs1.t10_0170;

おそらく「IIF」の使い方が悪いのだろうとは思いますが、
どうにもならなくなってしまいました。
みなさまのお知恵を拝借させてください。よろしくお願い致します。

※追記
みなさま連絡ありがとうございます。
参考にしながら以下のSQLを作りました。

【SQL文】

INSERT INTO M00_枝番判定前準備_最終管理番号 ( t10_0310, t10_0170, 最終管理番号 ) SELECT t10_seijs1.t10_0310   , t10_seijs1.t10_0170   , Switch(IsNull([t10_0361]),[t10_0360]       ,IsNull([t10_0362]),[t10_0361]       ,IsNull([t10_0363]),[t10_0362]       ,IsNull([t10_0364]),[t10_0363]       ,True,[t10_0364]) AS 式1 FROM    t10_seijs1;

実行した所、「最終管理番号」カラムが空のままで、他のカラムは抽出できました。
イメージ説明

ただ実行する前に「データシートビュー」を使用すると「最終管理番号」も表示されます。
イメージ説明

何故こうなるのか調べてみたのですが、これといったサイトが見つけられませんでした。

もし可能であれば、修正方法を教えていただけたら幸いです。

※M00_枝番判定前準備_最終管理番号

t10_0310t10_0170最終管理番号
日付/時刻型短いテキスト(フィールドサイズ7)短いテキスト(フィールドサイズ255)

※t10_seijs1

t10_0310t10_0170t10_0360t10_0361t10_0362t10_0363t10_0364
日付/時刻型短いテキスト(フィールドサイズ7)短いテキスト(フィールドサイズ11)短いテキスト(フィールドサイズ11)短いテキスト(フィールドサイズ11)短いテキスト(フィールドサイズ11)短いテキスト(フィールドサイズ11)

※※t10_seijs1のデータ自体は件数がたくさんあるのでサンプルをどのように出せばいいのか分かりません。
例えば、最初の【抽出結果】の表のデータが近いかと思います。

申し訳ないのですが、よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

最終的には「開始日」「ロット番号」「最終管理番号」のみのテーブルを作成

正規化を行わないと無暗にテーブルが増えてしまいますよ。
先ずは、t10_seijs1の正規化を行うと、「開始日」「ロット番号」「管理番号」「連番」の様なテーブルになります。(そもそも出自が不明なので根本的な正規化なのかは、不明ですが)
正規化後の内容は以下の様なユニオンクエリーで表すことができます。
※このクエリーを元にテーブル作成クエリーを使えば正規化したテーブルを作成する事が出来ます。

SQL

1 SELECT t10_0310 AS 開始日, t10_0170 AS ロット番号, t10_0360 AS 管理番号, 1 as 連番 FROM t10_seijs1 where t10_0360 is not null 2union all 3 SELECT t10_0310, t10_0170, t10_0361, 2 FROM t10_seijs1 where t10_0361 is not null 4union all 5 SELECT t10_0310, t10_0170, t10_0362, 3 FROM t10_seijs1 where t10_0362 is not null 6union all 7 SELECT t10_0310, t10_0170, t10_0363, 4 FROM t10_seijs1 where t10_0363 is not null 8union all 9 SELECT t10_0310, t10_0170, t10_0364, 5 FROM t10_seijs1 where t10_0364 is not null

上記で正規化されたテーブルを「t10_seijs0」という名前にしたすると、求めたいものは以下のクエリーで抽出できます。

SQL

1SELECT 開始日, ロット番号, 管理番号 as 最終管理番号 2FROM t10_seijs0 as base 3WHERE CDATE(開始日)= #2022/04/28# 4 and 連番=(select max(連番) from t10_seijs0 where ロット番号=base.ロット番号) 5ORDER BY ロット番号

※正規化しないなら上記SQL内のテーブルをユニオンクエリーで置き換えて下さい。

投稿2022/05/07 12:34

sazi

総合スコア25184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nyk.

2022/05/07 19:42

ありがとうございます。 通常であれば「連番」等の正規化が必要なのですが、 一時的なワークテーブルのような使用の仕方をするのでしっかりした作り方をしていませんでした。 あと折角教えていただいたのに大変恐縮なのですが、 >※このクエリーを元にテーブル作成クエリーを使えば正規化したテーブルを作成する事が出来ます の部分がうまくできませんでした。 いただいたSQLを「SQLビュー」にはりつけて、 そこから「テーブル作成」を選択、実行したのですが、 「You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UNION ALL (SELECT 't10_0310','t10_0170','t10_0361' ,2 FROM 't10_seijs1' WHERE at line 1 (#1064)」 になってしまいました。 私のやり方がまずいのだと思うのですが、他のやり方を検討してしまいました。 申し訳ありません。
sazi

2022/05/08 12:30 編集

MySQLのエラーとなっているところからすると、AccessでMySQLのリンクテーブル使用しているという事でしょうか? エラーそのものはパススルークエリにしているとか、MYSQLでの実行では無いですか?
nyk.

2022/05/12 07:19

コメントいただいているのに遅くなってしまい申し訳ありません。 >AccessでMySQLのリンクテーブル使用 はい、リンクテーブルにしています。 「パススルー」のアイコンはオフになっています。 >MYSQLでの実行では無いですか すいません、確認の仕方が分からないです。
guest

0

当方でサンプルを作成して確認しました。
提示のSQLには全角空白が含まれているのでそれを半角空白に修正して確認したところ、正常に表示されました。

sql

1SELECT 2 t10_seijs1.t10_0310 AS 開始日 3 , t10_seijs1.t10_0170 AS ロット番号 4 , IIf(IsNull([t10_0361]),[t10_0360] 5 ,IIf(IsNull([t10_0362]),[t10_0361] 6 ,IIf(IsNull([t10_0363]),[t10_0362] 7 ,IIf(IsNull([t10_0364]),[t10_0363],[t10_0364])))) AS 最終管理番号 8 , t10_seijs1.t10_0360 AS 管理番号① 9 , t10_seijs1.t10_0361 AS 管理番号② 10 , t10_seijs1.t10_0362 AS 管理番号③ 11 , t10_seijs1.t10_0363 AS 管理番号④ 12 , t10_seijs1.t10_0364 AS 管理番号⑤ 13FROM 14 t10_seijs1 15WHERE 16 (((t10_seijs1.t10_0310) Like "2022/04/28*")) 17ORDER BY 18 t10_seijs1.t10_0170;

ちなみに、IIfの入れ子にするより、Switch関数を使った方が読みやすいかと。
また、開始日が日付/時刻型なら、Like演算子で文字列として比較するのは重くなる可能性があります。

sql

1SELECT 2 t10_seijs1.t10_0310 AS 開始日 3 , t10_seijs1.t10_0170 AS ロット番号 4 , Switch(IsNull([t10_0361]),[t10_0360] 5 ,IsNull([t10_0362]),[t10_0361] 6 ,IsNull([t10_0363]),[t10_0362] 7 ,IsNull([t10_0364]),[t10_0363] 8 ,True,[t10_0364]) AS 最終管理番号 9 , t10_seijs1.t10_0360 AS 管理番号① 10 , t10_seijs1.t10_0361 AS 管理番号② 11 , t10_seijs1.t10_0362 AS 管理番号③ 12 , t10_seijs1.t10_0363 AS 管理番号④ 13 , t10_seijs1.t10_0364 AS 管理番号⑤ 14FROM 15 t10_seijs1 16WHERE 17 t10_seijs1.t10_0310 between #2022/04/28# And #2022/04/28 23:59:59# 18ORDER BY 19 t10_seijs1.t10_0170;

投稿2022/05/07 06:41

hatena19

総合スコア33715

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nyk.

2022/05/07 19:34

確認ありがとうございます。 全角⇔半角、Switch関数、日付/時刻型のbetween使用など、勉強になります。 その辺り反映しながらもう少しやってみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問