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

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

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

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

9547閲覧

Access SQL Switch文が長すぎてエラーになる

tsunacan292

総合スコア5

Access

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2020/06/10 05:20

業務でAccessを使う必要があり、既存のテーブルから設定した分類ごとに集計を行いたいと考えています。

下に記載したSQL文を実行すると、「データベース エンジンの不明なエラー」となります。SWITCH文で32項目を分類しているのですが、そのうち4行分をコメントアウトすると実行することができました。
(SWITCHは13回以上はネストしないと使えないとどこかに書いてにあったので、13回を超える時点でネストしています)

恐らくSWITCH文が長すぎるせいでエラーになってしまっていると思うのですが。。。

SQL文分割して2度流せばできることなのですが、なるべく1回のSQLで実行したいと考えています。
長くならずに実現できる方法はないでしょうか?

【テーブル】
テーブル名:t_製品データ

製品メインコード製品サブコード借方貸方部門コード期間
50222501100000002020年5月
50222504100000002020年5月
50221501100000002020年5月
50224501100000002020年5月
50225501100000002020年5月

【SQL文】

SELECT SWITCH( 製品メインコード = '50222' AND 製品サブコード = '501' , 'A' ,製品メインコード = '50222' AND 製品サブコード = '504' , 'B' ,製品メインコード = '50221' , 'C' ,製品メインコード = '50224' , 'D' ,製品メインコード = '50225' , 'E' ,製品メインコード = '50226' , 'F' ,製品メインコード = '50227' , 'G' ,製品メインコード = '50229' , 'H' ,製品メインコード = '50206' , 'I' ,製品メインコード = '50231' , 'J' ,製品メインコード = '50232' , 'K' ,製品メインコード = '50233' , 'L' ,製品メインコード = '50234' , 'M' ,TRUE, SWITCH( 製品メインコード = '50235' , 'N' ,製品メインコード = '50236' , 'O' ,製品メインコード = '50237' , 'P' ,製品メインコード = '50238' AND 製品サブコード <> '502' , 'Q' ,製品メインコード = '50238' AND 製品サブコード = '502' , 'R' ,製品メインコード = '50239' , 'S' ,製品メインコード = '50240' , 'T' ,製品メインコード = '50257' , 'U' ,製品メインコード = '50243' , 'V' ,製品メインコード = '50244' , 'W' ,製品メインコード = '50245' , 'X' ,製品メインコード = '50242' , 'Y' ,製品メインコード = '50263' , 'Z' ,TRUE, SWITCH( 製品メインコード = '50265' , 'A1' ,製品メインコード = '50248' AND 製品サブコード = '527' , 'B1' ,製品メインコード = '50248' AND 製品サブコード = '524' , 'C1' ,製品メインコード = '50248' AND 製品サブコード = '526' , 'D1' ,製品メインコード = '50248' , 'E1' ,TRUE, 'Z1' ) ) ) AS 分類 ,SUM(IIF(ISNULL(借方), 0, 借方)) - SUM(IIF(ISNULL(貸方), 0, 貸方))AS 金額 FROM t_製品データ WHERE 部門コード = '00000' AND 期間 = '2020年5月' GROUP BY SWITCH( 製品メインコード = '50222' AND 製品サブコード = '501' , 'A' ,製品メインコード = '50222' AND 製品サブコード = '504' , 'B' ,製品メインコード = '50221' , 'C' ,製品メインコード = '50224' , 'D' ,製品メインコード = '50225' , 'E' ,製品メインコード = '50226' , 'F' ,製品メインコード = '50227' , 'G' ,製品メインコード = '50229' , 'H' ,製品メインコード = '50206' , 'I' ,製品メインコード = '50231' , 'J' ,製品メインコード = '50232' , 'K' ,製品メインコード = '50233' , 'L' ,製品メインコード = '50234' , 'M' ,TRUE, SWITCH( 製品メインコード = '50235' , 'N' ,製品メインコード = '50236' , 'O' ,製品メインコード = '50237' , 'P' ,製品メインコード = '50238' AND 製品サブコード <> '502' , 'Q' ,製品メインコード = '50238' AND 製品サブコード = '502' , 'R' ,製品メインコード = '50239' , 'S' ,製品メインコード = '50240' , 'T' ,製品メインコード = '50257' , 'U' ,製品メインコード = '50243' , 'V' ,製品メインコード = '50244' , 'W' ,製品メインコード = '50245' , 'X' ,製品メインコード = '50242' , 'Y' ,製品メインコード = '50263' , 'Z' ,TRUE, SWITCH( 製品メインコード = '50265' , 'A1' ,製品メインコード = '50248' AND 製品サブコード = '527' , 'B1' ,製品メインコード = '50248' AND 製品サブコード = '524' , 'C1' ,製品メインコード = '50248' AND 製品サブコード = '526' , 'D1' ,製品メインコード = '50248' , 'E1' ,TRUE, 'Z1' ) ) );

【実行結果】

分類金額
A100
B-100
C100
D100
E100

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

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

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

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

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

guest

回答2

0

分類用のマスタを作るか、ユーザー定義関数を利用するかですね。
マスターはhatena19さんが回答されているので、ユーザー定義関数の場合で回答します。

以下の様なユーザー定義関数を作成します。

VBA

1Public Function 分類コード(製品メインコード, 製品サブコード) 2Dim w分類コード 3 Select Case 製品メインコード 4 Case "50222" 5 If 製品サブコード = "501" Then 6 w分類コード = "A" 7 ElseIf 製品サブコード = "504" Then 8 w分類コード = "B" 9 End If 10 Case "50221": w分類コード = "C" 11 Case "50224": w分類コード = "D" 12' 以下分岐が続く 13' ・ 14' ・ 15' ・ 16 Else: w分類コード = "Z1" 17 End Select 18 分類コード = w分類コード 19End Function

上記を利用したクエリーは以下の様になります。

SQL

1SELECT 分類コード(製品メインコード, 製品サブコード) AS 分類 2 , SUM(IIF(ISNULL(借方), 0, 借方)) - SUM(IIF(ISNULL(貸方), 0, 貸方)) AS 金額 3FROM t_製品データ 4WHERE 部門コード = '00000' 5 AND 期間 = '2020年5月' 6GROUP BY 分類コード(製品メインコード, 製品サブコード)

投稿2020/06/10 07:15

sazi

総合スコア25327

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

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

tsunacan292

2020/06/10 07:29

今回は、アクセスに新規のテーブルを配置できたのでマスタを作るほうで解決しました。 今後、テーブルをいじることのできないファイルの場合はこちらの方式を参考にさせていただきます。 ご回答ありがとうございました。
sazi

2020/06/10 07:43 編集

分類されていないものをZ1の分類にするというのはマスターだけでは解決しないはずなので、注意して下さい。 マスターで行うにしてもleft joinしての判断が必要になります。
guest

0

ベストアンサー

製品コードと分類の対応テーブルを作成してそれを利用すればいいでしょう。

メンテナンスもその方かやりやすいです。

テーブル名: t_分類

製品メインコード製品サブコード以外分類
50222501NoA
50222504NoB
502210NoC
502240NoD
・・・・
50238502YesQ
50238502NoR

仕様

  • 製品サブコードが 0 の場合は、すべて抽出(サブコードを条件にしない)
  • 「以外」フィールドはYes/No型、Yesの場合のそのサブコード以外を抽出

sql

1SELECT t_製品データ.*, t_分類.分類 2FROM t_製品データ, t_分類 3WHERE 4t_製品データ.製品メインコード=t_分類.製品メインコード 5And 6IIf(t_分類.製品サブコード=0, True, 7 IIf(t_分類.以外=True, 8 t_製品データ.製品サブコード<>t_分類.製品サブコード, 9 t_製品データ.製品サブコード=t_分類.製品サブコード) 10 ) 11;

集計クエリ

sql

1SELECT t_分類.分類, Sum(Nz(借方)-Nz(貸方)) AS 金額 2FROM t_製品データ, t_分類 3WHERE 4t_製品データ.製品メインコード=t_分類.製品メインコード 5And 6IIf(t_分類.製品サブコード=0, True, 7 IIf(t_分類.以外=True, 8 t_製品データ.製品サブコード<>t_分類.製品サブコード, 9 t_製品データ.製品サブコード=t_分類.製品サブコード) 10 ) 11GROUP BY t_分類.分類;

追記

Z1 の考慮がされてませんでしたので、それを考慮したSQLを追記しておきます。

sql

1SELECT Nz(t_分類.分類,"Z1") AS 分類, Sum(Nz(借方)-Nz(貸方)) AS 金額 2FROM 3 t_製品データ LEFT JOIN t_分類 4ON t_製品データ.製品メインコード=t_分類.製品メインコード 5And 6IIf(t_分類.製品サブコード=0, True, 7 IIf(t_分類.以外=True, 8 t_製品データ.製品サブコード<>t_分類.製品サブコード, 9 t_製品データ.製品サブコード=t_分類.製品サブコード) 10 ) 11WHERE 12 部門コード = '00000' 13 AND 14 期間 = #2020/5/1# 15GROUP BY Nz(t_分類.分類,"Z1");

投稿2020/06/10 06:15

編集2020/06/10 08:51
hatena19

総合スコア34075

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

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

tsunacan292

2020/06/10 07:26

分類用のテーブルを作る。。。という方法が頭からすっかり抜けていました。 今回はアクセスにテーブルを作成可能でしたので、こちらの方法でうまくいきました! ご回答ありがとうございました。
sazi

2020/06/10 07:31

Z1の考慮が漏れていないか確認下さいね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問