Excel (一般機能)

Excelの一般機能に関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(指定なし : 指定なし)
パワークエリでクエリの式が複雑過ぎますと言われます
投稿日時: 24/08/05 16:50:03
投稿者: 2365

標記の件でどなたかお知恵をお貸しください。
 
当社で取扱う商品のデータベースにセンター毎の在庫数を新規マージでくっつけたのですが、元の商品のデータベース自体が既に色々なデータベースをマージしたものだったり、複数のステップを追加していたからかどうか、マージ自体は出来るのですが、それを展開しようとすると「DataFormat.Error.クエリ式'(((((・・・・・・の式が複雑過ぎます」とコメントが出て、せっかくマージした情報が表示できません。
 
検索したところ、ネストが多すぎると複雑過ぎるというコメントが出やすいとのことでしたが、なんとかマージ結果を表示させる方法はありますでしょうか?
 
マージできたのに表示できないというのがなんとも。。。。
 
何卒よろしくお願いいたします。

回答
投稿日時: 24/08/06 10:18:37
投稿者: Suzu

ネストを浅くしましょう。
 
1つのクエリ内で、複数のデータソースを一気にマージするのではなく
1つのクエリ内では、2つまたは3つ程度のデータソースをマージする様にし
必要に応じて、それらのクエリ同士をさらにマージする様にしてみてください。
 
 
 
データベースとしてどんなデータベースシステムを使用しているか判りませんが
Excel側でマージするのではなく、
データべース管理者に相談し、
元のデータベース側でマージし、クエリとして保存・公開し、
そのクエリをExcelから取得する事も検討してはどうでしょうか。

投稿日時: 24/08/06 10:34:26
投稿者: 2365

Suzu様、ご返信有り難うございます。
ネストを浅く。。。。そうですよね。
そう思ってマージを2回にわけたり、元のソースからクエリを削除して値にしたものを改めてインポートして、ソレをマージしたりと色々試しているのですが、改善出来ません。。
パワークエリってエディター上のステップはとても簡単で関数とかが表示されているボックス内の数式?もそんなにネストされていないのに、エラーコメント上はめっちゃネストされているんですよね。。。。
 
例えばですが、
 
関数ボックス?内の数式 ↓
= Table.SelectRows(#"展開された 在庫情報", each ([商品コード] <> null))
 
エラーコメント↓
DataFormat.Error: クエリ式 '(((((((((((((((((((((((([_].[在庫センタ2] = '241' and [_].[在庫センタ2] is not null) and ([_].[商品2] = '134452' and [_].[商品2] is not null) or ([_].[在庫センタ2] = '241' and [_].[在庫センタ2] is not null) and ([_].[商品2] = '152448' and [_].[商品2] is not null)) or ([_].[在庫センタ2] =' の 式が複雑すぎます。
詳細:
    ☆商品マスタ_zaiko.accdb
 
という具合です。
何か改善方法思い当たりましたら、重ねてで恐縮ですがお教え頂けますと幸いです。

回答
投稿日時: 24/08/06 11:23:11
投稿者: Suzu

【展開された 在庫情報】のソースを確認ください。
 
そこに、そのソースがありませんか?
または、さらに、そのソース・・・ と辿っていくとあるはず。
 
 
中身自体はこれだけでは判断できませんが
 

引用:
(
    ([_].[在庫センタ2] = '241' and [_].[在庫センタ2] is not null)
    and
    ([_].[商品2] = '134452' and [_].[商品2] is not null)
    or
    ([_].[在庫センタ2] = '241' and [_].[在庫センタ2] is not null)
    and
    ([_].[商品2] = '152448' and [_].[商品2] is not null)
)
or
([_].[在庫センタ2] =' の 式が複雑すぎます。

 
or の位置 合っていますか?
 
(
(
    ([_].[在庫センタ2] = '241' and [_].[在庫センタ2] is not null)
    and
    ([_].[商品2] = '134452' and [_].[商品2] is not null)
)
    or
(
    ([_].[在庫センタ2] = '241' and [_].[在庫センタ2] is not null)
    and
    ([_].[商品2] = '152448' and [_].[商品2] is not null)
)
)
 
赤の部分は要りませんか?
 
 
テーブル?同士を 内部接続しているのか、外部接続しているのか分かりませんが
内部接続なのであれば
 商品2 の Not Null のみ 抽出したクエリ
 在庫センタ2 の Not Null のみを抽出したクエリ
を予め用意し
 
それらを接続し、
 在庫センタ2 が 241
 かつ
 商品2 が 134452 または 商品2 が 152448
のレコードを抽出
 
accdb なのであれば、Access側で、クエリを用意した方が良いと思います。
 
 
また、「展開された 在庫情報」の様に、空白文字を含む クエリ名 は避ける。
 
 
今は問題となっておりませんし、直接関係はありませんが
「☆」は インクリメンタルサーチ の一部なのでしょうが
他のOS や、ネットアップ時に、問題が発生する可能性があるので止めた方が良いと思います。

回答
投稿日時: 24/08/06 11:58:34
投稿者: sk

引用:
当社で取扱う商品のデータベースにセンター毎の在庫数を新規マージでくっつけた

そのクエリが実際にどのような構造になっているのかが不明瞭であるため、
現時点では具体的な改善策の提案は難しいでしょう。
 
1. 「御社で取扱う商品のデータベース」から任意のテーブル/ビューを
   参照するクエリ
 
2. 「センター毎の在庫数」を求めるクエリ
   (データソースが 1 と同一なのか、異なるデータソースを
    参照しているかは不明)
 
3. 上記 1 と 2 をマージするクエリ。
 
仮に以上の 3 つのクエリが存在しているのであれば、とりあえず
それぞれのクエリを詳細エディターで開き、表示された式全体を
そのまま明記されることをお奨めします。
 
引用:
= Table.SelectRows(#"展開された 在庫情報", each ([商品コード] <> null))

上記のステップが 3 のクエリ上のものであるなら、
例えばその直前のステップでバッファー処理を
行なってみてはいかがでしょうか。
 
--------------------------------------------------------------
 
=Table.Buffer(#"展開された 在庫情報")
 
--------------------------------------------------------------

投稿日時: 24/08/06 16:23:09
投稿者: 2365

Suzu様有り難うございます。
 
展開された在庫情報は大きなデータをセンターコード6つで抽出しているだけで、センターコードも商品コードもnullは無い筈なんですが。。
ただ、ご指摘のorの部分、赤い括弧が必要かどうかに関しては、必要だと思います。
しかしそれを修正する手立てが分からない。。。
 
「展開された 在庫情報」に関しては、クエリ名を修正して空白を削除しました。
また☆に関しても承知いたしました。アドバイスありがとうございます。
 
上記の修正は私には高度だったので、ひとまず在庫情報の元データはアクセスの為、アクセス上で、6つのセンターコードに絞ったテーブルを作成して、そこからデータを取得してやってみようと思います。
 
ご教示有り難うございました。

回答
投稿日時: 24/08/06 16:57:44
投稿者: Suzu

2365 さんの引用:
在庫情報の元データはアクセスの為

 
先の条件式について
 
在庫センタ2  "241" の条件 がありますから、Is Not Null は不要
同様に、商品2 についても、Is Not Null は不要
 
 
在庫センタ2 が、241 かつ、(商品2 が 134452 または152448) が 条件となります。
 
これを、Access側で処理するのであれば In演算子 が使用できます。
 
条件式としては
[在庫センタ2] = "241" And [商品2] In ("134452", "152448")
で実現可能です。
 
 
 
引用:
6つのセンターコードに絞ったテーブルを作成して、そこからデータを取得してやってみようと思います。

 
絞ったテーブルを作成というのは、
目的のセンターコード毎に、テーブルを作成して という事でしょうか?
 
データベース的な考え方を行うと あまり 好ましくはないです。
 
テーブル作成が許されているのであれば、
 
抽出条件Tbl
-------------------
在庫センタ2    商品2
-------------------
"241"    "134452"
"241"    "152448"
 :   :
 
と、
各条件の値をテーブルとして持たせ、
元のテーブルと、抽出条件Tbl を 内部連結してしまえば
目的のレコードを得られるはずです。

トピックに返信