業務でAccessを使う必要があり、既存のテーブルから設定した分類ごとに集計を行いたいと考えています。
下に記載したSQL文を実行すると、「データベース エンジンの不明なエラー」となります。SWITCH文で32項目を分類しているのですが、そのうち4行分をコメントアウトすると実行することができました。
(SWITCHは13回以上はネストしないと使えないとどこかに書いてにあったので、13回を超える時点でネストしています)
恐らくSWITCH文が長すぎるせいでエラーになってしまっていると思うのですが。。。
SQL文分割して2度流せばできることなのですが、なるべく1回のSQLで実行したいと考えています。
長くならずに実現できる方法はないでしょうか?
【テーブル】
テーブル名:t_製品データ
製品メインコード | 製品サブコード | 借方 | 貸方 | 部門コード | 期間 |
---|---|---|---|---|---|
50222 | 501 | 100 | 00000 | 2020年5月 | |
50222 | 504 | 100 | 00000 | 2020年5月 | |
50221 | 501 | 100 | 00000 | 2020年5月 | |
50224 | 501 | 100 | 00000 | 2020年5月 | |
50225 | 501 | 100 | 00000 | 2020年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' ) ) );
【実行結果】
分類 | 金額 |
---|---|
A | 100 |
B | -100 |
C | 100 |
D | 100 |
E | 100 |
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/10 07:29
2020/06/10 07:43 編集