毎回大変お世話になってます。
1行だけのクエリデータを縦並びにしたいのですが、それは可能でしょうか?
現行データは
[項目A金額] [項目B金額] [項目C金額]・・・の1行だけのデータです(16項目)
10 15 100 ・・・
それを下記の様にしたいのです(順番は元データになく指定順に並べ替えしたい為のもの)
[項目] [金額] [順番]
A 10 1
B 15 2
C 100 3
いいアイデアあれば宜しくお願いします。
毎回大変お世話になってます。
1行だけのクエリデータを縦並びにしたいのですが、それは可能でしょうか?
現行データは
[項目A金額] [項目B金額] [項目C金額]・・・の1行だけのデータです(16項目)
10 15 100 ・・・
それを下記の様にしたいのです(順番は元データになく指定順に並べ替えしたい為のもの)
[項目] [金額] [順番]
A 10 1
B 15 2
C 100 3
いいアイデアあれば宜しくお願いします。
2通りの方法を載せておきます
■ 1 ~ 16 までの数値を入力した補助テーブルを使う方法
・DDL
・テーブルデータ
・DML
( 文中の クエリ名 及び 項目XXX金額 は実際の名前に変更して下さい )■ ユニオンクエリを使う方法
mayuさん ありがとうございます。
ユニオンクエリで試しまた。それでいけたのですが全項目だと”メモリ不足”や”これ以上テーブルは無理”のメッセージが出ます。5ヶ位づつのユニオンだといけます。ベースの各項目が計算でして出したものだからでしょうか?
このデータはAccessで作成したものでしょうか。
それとも外部から取り込んだものでしょうか。
どちらにしてもリレーショナルデータベースとしてはNGなテーブル設計です。
Accessで作成したものならテーブル設計を欲しい結果の形(正規形)になるようにし直しましょう。
外部から取り込んだものなら取り込むときに正規形のテーブルに変換して取り込むようにしましょう。
取り込むときに変換する方法はいろいろありますが、mayuさんの回答のクエリで正規形に変換して追加クエリで追加するのもひとつの方法です。
クエリの列数は 16 ということでしたが、実際は 16 列以上だったりしないでしょうか
あまりに縦結合する回数が多かったり、
演算フィールドの値に定義域集計関数を使っていたりすると、リソース不足になることも十分ありえます
また、>> 1の回答で補助テーブルを使う方法も紹介していますが、こちらの結果はどうだったのでしょうか
ユニオンクエリより軽い( クエリのデータスキャンが一回で済みます )ので
メモリ不足のエラーが発生するとは考えにくいです
16の演算フィールドは 全て同じ計算方法 で算出していますか
浮動小数点が含まれる列・含まない列があったり、列毎に使用する関数が異なっているなど
データ型が混在
してたりはしないでしょうか混在する場合は、結合の際に CCur関数などで演算フィールドのデータ型を統一する必要があるでしょう
UNION ALL句を5回内包した単体のユニオンクエリを 3 ~ 4つ作り
単体のユニオンクエリ同士を、再度 UNION ALL で結合したということでしょうか
もし、そうであるなら 単体のクエリで利用するリソースが多すぎるということです
先に述べたように、補助テーブルを使う方法が妥当でしょう
hetenaさん ありがとうございます。
現行データはACCESS作成分で下記SQLとなってます。(最終的に18項目となりました)
FROMのクエリは集計クエリで分類毎の合計金額を出してます。その各合計金額を上記で更に色々計算させています(それで1行のデータになってます)。それを後々扱い易い様に縦並びにしたいのです。
この1行のデータの形がよくないでしょうか?
このクエリデータを変形しようとしているのですね。
このクエリのソース自体も名称からして集計クエリのようですね。
集計クエリをもとにクエリを作成するという設計は重い処理になりがちです。
メモリ消費も多くなりそうです。
また、このクエリは縦並びのもの(正規化された形)を横並びになるように変形するものですね。
で、質問でやろうとしていることは、この横並びのものを再び縦並びに戻すということですね。
縦のものを横にして、再び縦に戻すという無駄なことをしているように思えます。
大元のテーブルが正規化されたものなら、そこから直接希望の結果データを得るクエリを考えた方が軽い処理になりそうです。
mayuさん ありがとうございます。
もう一つの方法で下記SQL実行させると クエリ式エラー , Choose( *** ’の構文エラー:演算子がありませんとなります。何か間違えてます?
Q試算表用Base10_損益各利益 クエリには 18列 あるわけですから
t_num のテーブルデータは、1~ 16 ではなく、1 ~ 18 になっていますか
また、>> 6のSQL文中に全角空白が含まれていますから、全て半角に修正して下さい
SQL文の句間を区切る空白に全角は使えません
それと
損益分類ID 12 は勘定科目が重複していますから、当期純利益の値が正確ではないように思えます
mayuさん ありがとうございます。
やはり全角スペースが入ってた様です。それを注意深く修正したら出来ました。
金額算出の指摘もありがとうございました(確かに間違ってました)。
この素晴らしいSQLは半分も理解できてないのですが(すみません)、コードのままだと項目がA、B・・・になってます(多分ChrWの兼ね合いですね)。それを元データのフィールド名の”期首在庫” ”仕入高” 等にするにはどうすればいいでしょうか? それと各金額を通貨型にするにはどうしたらいいでしょうか?(現在は文字列型になっているので)
方法としては大きく2つあります
【 1 】
t_num テーブルに従属列を作り、2列構成にします
SQL文では ChrW関数の使用箇所を
とテーブルの従属列への参照に置き換えるのが王道と言えるでしょう
個々のデータをテーブルというオブジェクトを使って「可視化」できるメリットが大きいため
私としては、こちらの方法をお薦めします
【 2 】
t_num テーブルは1列構成のままにしておき、SQL文中に文字リテラルを直に埋め込んでもいいでしょう
( お薦めはしませんが )
【 1 】の方法で実装したSQL
【 2 】の方法で実装したSQL
mayuさん ありがとうございます。それで出来ました。
x,yとした分を直積でしているのですね(自動生成されたクエリで気づきました)。
こんな方法はとても思いつきません。
細かい指摘も含め大変お世話になりました。
hatenaさんの2回目の回答(10)を見落としてました。失礼しました。
確かに仰る通りですね。縦に並んだ集計クエリを抜粋すると下記の様になってます。
項目 集計金額 ・・・
A 50
B 30
C 15
D 100
* *
これをA-B=X、X-C=Y のX、Yを縦並びの設計はどうなりますでしょうか? 根本から考え直す必用あり?
下記のページの方法が参考になると思います。
レポートでの複雑な集計、グループ化(会計帳票) - hatena chips
簡単に説明すると項目マスターとは別に演算用のグループマスターを作成しておいてそれを結合して集計クエリにするという方法になります。
hatenaさん ありがとうございます。
各グループに段階的に1、-1持たして集計合計の形ですね。応用できる様に工夫してみす。
まずは参考分を理解するようにします。