プロが教えるわが家の防犯対策術!

アクセス2003を使って注文管理のデータベースを作っています。
テーブル「納品データ」のデータを発注番号ごとに納品日と納品数を横に並べたものを作りたいのですが、集計クエリでやってみてもうまくできませんでした。過去の質問の中にも似たようなものがあったのですが、一部理解できない箇所があったりして方法が分からなかったため、質問させていただきます。

■テーブル「納品データ」

|納品番号|発注番号|納品日|納品数|
  1     1   04/01  5
  2     1   04/02  4
  3     1   04/03  3
  4     2   04/06  8
  5     2   04/08  7
  6     3   04/04  6
  7     3   04/07  5
  8     3   04/09  4
  9     4   04/05  7
  10     4   04/08  8


■今やろうとしているもの

発注番号|納品日|納品数|納品日|納品数・・・
 1   04/01  5  04/02  4  04/03 3
 2   04/03  8  04/04  7  
 3   04/02  6  04/03  5  04/04 4
 4   04/02  7  04/03  8

うまく表形式でできなくて、ズレていてすみません。
最終的には、これをサブクエリとしてメイン-サブの親子レポートを作成しようと思っています。

A 回答 (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"として桁合わせを行っています。

余計に分からなくなったかも?と危惧しています。
説明は苦手なので、後はヘルプや書籍などで勉強してくださいませ。

この回答への補足

ご回答ありがとうございます。いろいろとアドバイスいただいたおかげで、だんだん分かってきました。できましたら、最後の最後にもう1つだけm(_ _)m 解説の解説をお願いできればと・・。

>ここでTBL1の中から、tbl1.発注番号=" & 発注番号であり
かつ
TBL1.納品番号<=" & 納品番号であるものをカウントします。

tbl1.発注番号=" & 発注番号 のところですが、具体的に何と何が同じであればということなのでしょうか・・。
tbl1.発注番号は、架空のもので、" & 発注番号はテーブル「納品データ」の発注番号のことを指しているのでしょうか?
同じように、TBL1.納品番号<=" & 納品番号のところも解説いただけると助かります。

理解力が足りなくて、ほんとうに申し訳ありませんがよろしくお願いします。

補足日時:2006/04/28 10:13
    • good
    • 0

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の納品番号から求めます)
となります。

では。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。丁寧にアドバイスしていただき、本当に感謝しています。まだまだ勉強不足で理解しきれていない部分もありますが、ヘルプや参考書などももっと活用してしっかりと応用できるようにしていきたいと思います。

お礼日時:2006/05/02 15:45

それなら始めから・・・ (^_^;)


第二弾です。
(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つあってとか書いてあったのですが、よく分からなくて・・。よろしくお願いします。

補足日時:2006/04/27 11:44
    • good
    • 0

こんな風でしょうか?



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;

※クロス集計をレポートにしようとすると、フィールド数の増減があるので
苦労されると思います。

参考URL:http://www.ruriplus.com/msaccess/tch/tch_007.html

この回答への補足

ご回答ありがとうございます。そのままコピペしたらできました。ただ、レポート上で1行ずつの数量合計を出そうと思ったら、12と出したいところが543となってしまいました。合計を出すことはできるのでしょうか?

補足日時:2006/04/26 16:59
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!