- ベストアンサー
アクセスデータを横に並べる方法
- アクセス2003を使用して注文管理のデータベース作成中。テーブル「納品データ」のデータを発注番号ごとに納品日と納品数を横に並べたい。集計クエリではうまくできないため、質問する。
- 発注番号ごとに納品日と納品数を横に並べたいが、表形式でうまく表示できない。サブクエリとして親子レポートを作成する予定。
- アクセス2003での注文管理データベース作成中。納品データテーブルの情報を発注番号ごとに納品日と納品数を並べる方法が分からず、質問しました。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
今回の場合、 クロス集計でなんとかなりそうと思いました。 その為には並べ替えに使用するキーが「一意」である必要があります それには、発注番号 & 納品番号が使えそう・・・ そこで、発注番号「毎」 かつ 納品番号順での連番を作成することにします DCount("*","TBL1","TBL1.納品番号<=" & 納品番号 & "and tbl1.発注番号=" & 発注番号) ここでTBL1の中から、tbl1.発注番号=" & 発注番号であり かつ TBL1.納品番号<=" & 納品番号であるものをカウントします。 (このクエリの現レコードの納品番号 以下のものを テーブルTBL1の納品番号から求めます) なお、今回の場合は、年月日と納品数の二つを表示しなくてはいけませんので 選択クエリを二つ作成してUnion Allし、これをQQ(サブクエリ)としています Format・・・については カウントされた数は1,2、・・10,11・・となりますが、並べ替えの際に文字列として判断されると 並び順は1,10,11、・・2,20、となってしまいます。 また Format(・・) & "1"、Format(・・) & "2" として年月日→数の並び替えを調整して いますので、この為にも"00"として桁合わせを行っています。 余計に分からなくなったかも?と危惧しています。 説明は苦手なので、後はヘルプや書籍などで勉強してくださいませ。
その他の回答 (3)
- nicotinism
- ベストアンサー率70% (1019/1452)
DCount("*","TBL1","TBL1.納品番号<=" & 納品番号 & "and tbl1.発注番号=" & 発注番号) DCount の説明はヘルプでご覧になりましたか?理解されましたか? 今回の場合、 クエリの元となっているフィールド(TBL1.納品番号)、参照先のフィールド(納品番号)とも 同じなので分かりづらいかとは思いますが DCount("*","TBL1","TBL1.納品番号<=" & 納品番号 & "and tbl1.発注番号=" & 発注番号) ↓ DCount("*","TBL2","TBL1.納品番号<=" & 納品番号 & "and tbl1.発注番号=" & 発注番号) としたらこの意味は分かりますか? 冒頭の文は、同様にして DCount("*","TBL1"(検索対象のテーブル名),"TBL1.納品番号(このクエリのフィールド)<=" & 納品番号(検索対象のテーブルのフィールド名) & "and tbl1.発注番号(このクエリのフィールド名)=" & 発注番号(検索対象のテーブルのフィールド名)) という意味です。 DCount("*","TBL1"(検索 ~~号(検索対象のテーブルのフィールド名)) で一行です。 つまり、前回レスの ここでTBL1の中から、tbl1.発注番号=" & 発注番号であり かつ TBL1.納品番号<=" & 納品番号であるものをカウントします。 (このクエリの現レコードの納品番号 以下のものを テーブルTBL1の納品番号から求めます) となります。 では。
お礼
ご回答ありがとうございました。丁寧にアドバイスしていただき、本当に感謝しています。まだまだ勉強不足で理解しきれていない部分もありますが、ヘルプや参考書などももっと活用してしっかりと応用できるようにしていきたいと思います。
- nicotinism
- ベストアンサー率70% (1019/1452)
それなら始めから・・・ (^_^;) 第二弾です。 (1)と(2)と(3)は消してからお試しください。 また(1)と(2)の間のSQL文だけ、(1)と(3)の間のSQL文だけ、 をそれぞれ貼り付けたらどうなるかも 試してください。 何かが見えてくると思います。 TRANSFORM First(QQ.F1) AS F1の先頭 SELECT QQ.発注番号, Sum(QQ.納品数計) AS 納品数計 FROM [ (1) SELECT TBL1.納品番号, TBL1.発注番号, TBL1.納品日 as F1 , TBL1.納品数 as 納品数計, format(DCount("*","TBL1","TBL1.納品番号<=" & 納品番号 & "and tbl1.発注番号=" & 発注番号),"00") & "1" AS cnt FROM TBL1 (2) union all SELECT TBL1.納品番号, TBL1.発注番号, TBL1.納品数 as F1, Null as 納品数計, format(DCount("*","TBL1","TBL1.納品番号<=" & 納品番号 & "and tbl1.発注番号=" & 発注番号),"00") & "2"AS cnt FROM TBL1 (3) ]. AS QQ GROUP BY QQ.発注番号 PIVOT QQ.cnt; ついでに 納品日と納品数が左寄せになっているのは、異なるデータ型(数値、日付)をUnionした為の型変換で どうしようもありませんが(あるかも知れないが私は知らない)、 それぞれ、 TBL1.納品日 as F1 → format(TBL1.納品日,"@@@@@@@@@@@") as F1 TBL1.納品数 as F1 → format(TBL1.納品数,"@@@@@@@@@@@") as F1 などと、@ の数を最大桁数+1 位にしておけば、それっぽく見えます。
補足
ご回答ありがとうございます。最初からやり直しになってしまったようで、お手数かけてすみませんでした。 >また(1)と(2)の間のSQL文だけ、(1)と(3)の間のSQL文だけ、をそれぞれ貼り付けたらどうなるかも試してください。何かが見えてくると思います。 勉強不足ではっきりとは見えませんが(^_^;) (1)のところで納品日、(2)のところで納品数を表示させているというのは分かりました。 もしよかったら、1箇所解説をお願いしたい部分があります。 format(DCount("*","TBL1","TBL1.納品番号<=" & 納品番号 & "and tbl1.発注番号=" & 発注番号),"00") & "1" AS cnt format関数で00書式にしてそれに1をくっつけて列名にしているのはなんとなく理解できたのですが、Dcount関数の中で何が行われているのかが分からなくて、教えていただけたらと思います。 Dcount関数には引数が3つあってとか書いてあったのですが、よく分からなくて・・。よろしくお願いします。
- nicotinism
- ベストアンサー率70% (1019/1452)
こんな風でしょうか? TRANSFORM First(QQ.F1) SELECT QQ.発注番号 FROM [ SELECT TBL1.納品番号, TBL1.発注番号, TBL1.納品日 as F1 , format(DCount("*","TBL1","TBL1.納品番号<=" & 納品番号 & "and tbl1.発注番号=" & 発注番号),"00") & "1" AS cnt FROM TBL1 union all SELECT TBL1.納品番号, TBL1.発注番号, TBL1.納品数 as F1, format(DCount("*","TBL1","TBL1.納品番号<=" & 納品番号 & "and tbl1.発注番号=" & 発注番号),"00") & "2"AS cnt FROM TBL1 ]. AS QQ GROUP BY QQ.発注番号 PIVOT QQ.cnt; ※クロス集計をレポートにしようとすると、フィールド数の増減があるので 苦労されると思います。
補足
ご回答ありがとうございます。そのままコピペしたらできました。ただ、レポート上で1行ずつの数量合計を出そうと思ったら、12と出したいところが543となってしまいました。合計を出すことはできるのでしょうか?
補足
ご回答ありがとうございます。いろいろとアドバイスいただいたおかげで、だんだん分かってきました。できましたら、最後の最後にもう1つだけm(_ _)m 解説の解説をお願いできればと・・。 >ここでTBL1の中から、tbl1.発注番号=" & 発注番号であり かつ TBL1.納品番号<=" & 納品番号であるものをカウントします。 tbl1.発注番号=" & 発注番号 のところですが、具体的に何と何が同じであればということなのでしょうか・・。 tbl1.発注番号は、架空のもので、" & 発注番号はテーブル「納品データ」の発注番号のことを指しているのでしょうか? 同じように、TBL1.納品番号<=" & 納品番号のところも解説いただけると助かります。 理解力が足りなくて、ほんとうに申し訳ありませんがよろしくお願いします。