Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1531 / 2272 ツリー ←次へ | 前へ→

【6513】複数テーブルのデータ集計2 チリ子 05/10/17(月) 16:01 質問[未読]
【6517】Re:複数テーブルのデータ集計2 てっちゃん 05/10/17(月) 16:52 回答[未読]
【6554】Re:複数テーブルのデータ集計2 チリ子 05/10/19(水) 16:52 質問[未読]
【6555】Re:複数テーブルのデータ集計2 てっちゃん 05/10/19(水) 18:39 回答[未読]
【6556】Re:複数テーブルのデータ集計2 チリ子 05/10/20(木) 10:49 質問[未読]
【6559】Re:複数テーブルのデータ集計2 てっちゃん 05/10/20(木) 18:24 発言[未読]
【6561】Re:複数テーブルのデータ集計2 てっちゃん 05/10/21(金) 9:52 回答[未読]
【6565】Re:複数テーブルのデータ集計2 チリ子 05/10/21(金) 11:28 回答[未読]
【6623】Re:複数テーブルのデータ集計2 チリ子 05/10/27(木) 10:04 質問[未読]
【6630】Re:複数テーブルのデータ集計2 てっちゃん 05/10/27(木) 13:43 発言[未読]
【6631】Re:複数テーブルのデータ集計2 チリ子 05/10/27(木) 14:02 質問[未読]
【6638】Re:複数テーブルのデータ集計2 てっちゃん 05/10/27(木) 18:15 発言[未読]
【6648】Re:複数テーブルのデータ集計2 チリ子 05/10/28(金) 9:12 質問[未読]
【6651】Re:複数テーブルのデータ集計2 てっちゃん 05/10/28(金) 11:57 回答[未読]
【6723】Re:複数テーブルのデータ集計2 チリ子 05/11/2(水) 16:03 お礼[未読]

【6513】複数テーブルのデータ集計2
質問  チリ子  - 05/10/17(月) 16:01 -

引用なし
パスワード
   てっちゃんさん、もう一つだけ教えてください。
区分をカウントした結果で、区分が自動で昇順に並び替えられているようなのですが、並び替えられずに、最初の月の区分が2だったら2を先に表示させるようにはできませんか?カウントした月順に表示させていのですが、、、、できませんか?

【6517】Re:複数テーブルのデータ集計2
回答  てっちゃん  - 05/10/17(月) 16:52 -

引用なし
パスワード
   ▼チリ子 さん:

#後々のため
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=6485;id=access
の続き

回答番号 6495 の
> クエリに
> 〜略〜
>> GROUP BY UQ2.[No], UQ2.区分, fxMakeGroup([No],[TB],[区分]);
> GROUP BY UQ2.[No], UQ2.区分, fxMakeGroup([No],[TB],[区分])
> ORDER BY fxMakeGroup([No],[TB],[区分]);
> と、並べ替えを追加して下さい。(';'も最後へ)
このことかな?

> 式に未定義関数'fxMakeGroup'があります。というエラー
は出なくなったので、並べ替えもできませんか?

一度、出来上がったクエリーをデザインビューで開いてみると、
分かりやすいかもしれません。
('fxMakeGroup'を非表示にしてますが、表示すると良いかも)

【6554】Re:複数テーブルのデータ集計2
質問  チリ子  - 05/10/19(水) 16:52 -

引用なし
パスワード
   ▼てっちゃん さん:

>一度、出来上がったクエリーをデザインビューで開いてみると、
>分かりやすいかもしれません。
>('fxMakeGroup'を非表示にしてますが、表示すると良いかも)
並びが良く分かりました。そこで問題が発生です。

一つ質問なんですが、テーブル名が0504・0505・0506などの名前でクエリを実行させた時の並びが変わりますが、、、
テーブル名ではなく、新しいテーブルの順に並び変わるようなことは出来ないでしょうか?ご教授宜しくお願致します。

【6555】Re:複数テーブルのデータ集計2
回答  てっちゃん  - 05/10/19(水) 18:39 -

引用なし
パスワード
   ▼チリ子 さん:

>一つ質問なんですが、テーブル名が0504・0505・0506などの名前で
>クエリを実行させた時の並びが変わりますが、、、
>テーブル名ではなく、新しいテーブルの順に並び変わるようなことは
>出来ないでしょうか?ご教授宜しくお願致します。

回答番号6494のクエリにおいて、
>> SELECT UQ2.[No], UQ2.区分, Count(UQ2.区分) AS カウント
>> FROM (SELECT UQ.*
>> FROM (SELECT [No], "0504" AS TB, 区分 FROM [0504] 〜(略)〜
           ~~↑~~         ^^^^(こちらはテーブル名)
            |
ここで[TB]を決定してます。(便宜上、テーブル名と同じにしました)
この名前を希望の順に並ぶようにしてあげると良いです。

表示してみて、なんとなく分かったかと思いますが、
fxMakeGroupは、[No]と[TB](テーブル名だった)を
くっつけたものを返しています。

なので、並び替えが希望に沿うものであれば、
数字でなくても良いです。
(例:A、B、C、、、とか)

【6556】Re:複数テーブルのデータ集計2
質問  チリ子  - 05/10/20(木) 10:49 -

引用なし
パスワード
   ▼てっちゃん さん

てっちゃんさんありがとうございます。
出来ました。書かれている内容を理解もせず使用しようとしていました。すいません。だんだん理解できて来ました。ありがとうございます。

どんどん質問してしまいますが、、、
新しいテーブルのデータの"No"があるものだけカウントするようなことはできませんか?0505(一番新しい)に1000というNoが存在したら、0506・0507とカウントしていき、もし0508にNoが存在しなかったら、0509にNoが存在しても0508以降はカウントしないというものです。すごく複雑ですが、できるでしょうか?
質問ばかりですいませんが、宜しくお願致します。

【6559】Re:複数テーブルのデータ集計2
発言  てっちゃん  - 05/10/20(木) 18:24 -

引用なし
パスワード
   ▼チリ子 さん:
>新しいテーブルのデータの"No"があるものだけカウントするようなことはできませんか?
>0505(一番新しい)に1000というNoが存在したら、0506・0507とカウントしていき、
>もし0508にNoが存在しなかったら、0509にNoが存在しても0508以降はカウントしない
>というものです。すごく複雑ですが、できるでしょうか?

う〜〜〜〜〜〜ん。。。。難しいですね。。。

ごめんなさい。できる、できないで言ったら「できる」と思いますが、
その方法を説明できるかどうか。。。。。

とりあえず、確認をいくつか。
[TB]の値の増加規則は何でしょう?
値からみて、「年月」のようにも思えますが、予想ではアレなんで。
(アレリーマン!?)

増加途中で欠ける事があるのでしょうか?
例えば、[No]1000のみでいったら、ご質問のように途中で欠ける
事があると思いますが、全体ではどうでしょう?
テーブル[0506]、[0507]、[0509]、、、
となるような事([0508]はテーブル自体無い)は?
その場合、[TB]の値が飛んだとみなす?、みなさない?


これらを考慮して、また自作関数で、各Noごとの抽出TB値を取得すれば
出来そうな気がします。

【6561】Re:複数テーブルのデータ集計2
回答  てっちゃん  - 05/10/21(金) 9:52 -

引用なし
パスワード
   ▼チリ子 さん:

一晩寝たら方法を一つ思いつきました。

はじめに、条件が結構面倒なので、クエリの数も増えて
ゴチャゴチャしてしまうことは、御了承下さい。

1.まず、各テーブルをくっつけたユニオンクエリを作ります。
  これは、以前の回答(6494)
  http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=6494;id=access
  の中にあったもので、
  これを以後のデータ抽出の基本とします。
SELECT [No], "0504" AS TB, 区分 FROM [0504]
UNION
SELECT [No], "0505" AS TB, 区分 FROM [0505]
UNION
SELECT [No], "0506" AS TB, 区分 FROM [0506];
  名前を「Query_union」とします。


2.次にTBの値を連続にしたクエリを作ります。
  0504・0505・0506・0507・・・・
  と抽出されますが、[No]が"0506"から始まる場合、その[No]は
  "0506"以降が抽出されます。
SELECT Qno.[No], Qtb.TB
FROM
(SELECT [No], Min(TB) AS minTB FROM Query_union GROUP BY [No] ) AS Qno,
(SELECT TB FROM Query_union GROUP BY TB ) AS Qtb
WHERE Qtb.TB>=[Qno]![minTB]
ORDER BY Qno.[No], Qtb.TB;
  クエリ名を「Query_月TB」として下さい。
  あまり、クエリを増やすのもどうかと思ったので、少し端折りました。
  「Query_union」を[No]でグループ化し[TB]の最小値を抜出した「Qno」と
  「Query_union」を[TB]でグループ化したものをくっつけました。
  保存したら、デザインモードや実行結果を確認してください。


3.次は、[No]が欠ける最初の[TB]値を抽出します。
SELECT Query_月TB.[No], Min(Query_月TB.TB) AS TBの最小
FROM Query_月TB LEFT JOIN Query_union ON
(Query_月TB.TB = Query_union.TB) AND
(Query_月TB.[No] = Query_union.[No])
WHERE (Query_union.[No] Is Null)
GROUP BY Query_月TB.[No];
  クエリ名は「Query_欠ける最小値」です。


4.次に「Query_union」から集計対象を抽出します。
SELECT Query_union.*
FROM Query_union LEFT JOIN Query_欠ける最小値 ON
Query_union.[No] = Query_欠ける最小値.[No]
WHERE
(
(Query_union.[No] Is Not Null) AND
(Query_union.TB<[Query_欠ける最小値]![TBの最小])
) OR
(Query_欠ける最小値.[No] Is Null)
ORDER BY Query_union.[No], Query_union.TB;
  クエリ名を「Query_抽出対象」として下さい。


5.最後に4の「Query_抽出対象」に自作関数「fxMakeGroup」でグループ化
  集計すれば完成です。
SELECT [No], 区分, Count(区分) AS カウント
FROM Query_抽出対象
GROUP BY [No], 区分, fxMakeGroup([No],[TB],[区分])
ORDER BY fxMakeGroup([No],[TB],[区分]);


以上です。
簡単なテストしかしてませんので、検証は十分行ってください。

また、ある程度理解できたら、テーブル構造は、「Query_union」と同じになる
ようにする事をお勧めします。
抽出や集計の際の基本となる形であり、以後テーブルの追加があった場合、
そのデータを追加するのみで済み、クエリ等を変更する必要も無くなるので。
あと、フィールド名の[No]もYes/NoのNoと混同され易く、後のトラブルの
原因にもなりかねないので変更されることをお勧めします。

【6565】Re:複数テーブルのデータ集計2
回答  チリ子  - 05/10/21(金) 11:28 -

引用なし
パスワード
   ▼てっちゃん さん:
回答ありがとうございます。
>一晩寝たら方法を一つ思いつきました。
すごく悩んでいただき、ありがとうございます。
感謝、感謝です。感激しました。

>はじめに、条件が結構面倒なので、クエリの数も増えて
>ゴチャゴチャしてしまうことは、御了承下さい。
本当に、すごいクエリですね。。。私が理解するには、かなりの時間が必要かもしれません。少し時間がかかるかもしれませんが、挑戦してみます。
また、投稿させていただくと思いますが、その時は宜しくお願致します。

【6623】Re:複数テーブルのデータ集計2
質問  チリ子  - 05/10/27(木) 10:04 -

引用なし
パスワード
   ▼てっちゃん さん:
お久しぶりです。
かなり時間が経ってしまい申し訳ありません。
いろいろ自己都合があり、ようやく取り掛かることができました。
1〜4はモジュールをコピーさせて頂き実行しましたら。
てっちゃんさんの言っておられる通りの結果が表示されました。
そこで、5番なんですが、、、、、

>5.最後に4の「Query_抽出対象」に自作関数「fxMakeGroup」でグループ化
>  集計すれば完成です。
>SELECT [No], 区分, Count(区分) AS カウント
>FROM Query_抽出対象
>GROUP BY [No], 区分, fxMakeGroup([No],[TB],[区分])
>ORDER BY fxMakeGroup([No],[TB],[区分]);

新しくクエリにSQLで記入して実行させたものが結果になるのですよね?

【6630】Re:複数テーブルのデータ集計2
発言  てっちゃん  - 05/10/27(木) 13:43 -

引用なし
パスワード
   ▼チリ子 さん:

>新しくクエリにSQLで記入して実行させたものが結果になるのですよね?
そのつもりで作ってみたのですが、何かおかしかったですか?

ちなみに、
>1〜4はモジュールをコピーさせて頂き実行しましたら。
>てっちゃんさんの言っておられる通りの結果が表示されました。
1〜4についても、クエリ作成ということで回答させていただきました。

>>簡単なテストしかしてませんので、検証は十分行ってください。

【6631】Re:複数テーブルのデータ集計2
質問  チリ子  - 05/10/27(木) 14:02 -

引用なし
パスワード
   ▼てっちゃん さん:
返信ありがとうございます。

>>新しくクエリにSQLで記入して実行させたものが結果になるのですよね?
>そのつもりで作ってみたのですが、何かおかしかったですか?
結果なんですが、私の説明不足です。以前私が質問したURLです。
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=6556;id=access

…0504・0505・050テーブルがあり、Noが1000というデータが0504・0505に無くて
0506(最新のデータ)にあった場合は、0506のみをカウントするように出来ています。0504・0505にNoが1000というデータあり、0506(最新のデータ)に無い場合は、
カウント対象外にし、表示させたくないのです。説明がうまく出来なくて申し訳ありません。今回の結果では、表示されてしまうのです。

>>>簡単なテストしかしてませんので、検証は十分行ってください。
はい。

【6638】Re:複数テーブルのデータ集計2
発言  てっちゃん  - 05/10/27(木) 18:15 -

引用なし
パスワード
   ▼チリ子 さん:
すみません。
>0506・0507とカウントしていき、もし0508にNoが存在しなかったら、
>0509にNoが存在しても0508以降はカウントしないというものです。
こちらのみを考慮して、
>0505(一番新しい)に1000というNoが存在したら、
こちらの条件は考慮してませんでした。

とりあえず、
   0504 0505 0506 0507 0508 0509
1000   1   2   2      2   2
1001   2   2   1   1   1   2
1003   2   1   2   2   2   
1004         1   2   2   1
このようなデータの場合、
前回の回答では次のように出力されると思います。
No.  区分 カウント
1000  1    1
1000  2    2
1001  2    2
1001  1    3
1001  2    1
1003  2    1
1003  1    1
1003  2    3
1004  1    1
1004  2    2
1004  1    1

これが、どのように出力されると良いのでしょう?
最新は0504? 0509?

【6648】Re:複数テーブルのデータ集計2
質問  チリ子  - 05/10/28(金) 9:12 -

引用なし
パスワード
   ▼てっちゃん さん:
このような感じにしたいと思っています。
宜しくお願いします。

>とりあえず、
>   0504 0505 0506 0507 0508 0509
>1000   1   2   2      2   2
>1001   2   2   1   1   1   2
>1003   2   1   2   2   2   
>1004         1   2   2   1
>このようなデータの場合、
>前回の回答では次のように出力されると思います。
>No.  区分 カウント
>1000  1    1
>1000  2    2
>1001  2    2
>1001  1    3
>1001  2    1
>1003  2    1
>1003  1    1
>1003  2    3
>1004  1    1
>1004  2    2
>1004  1    1

>これが、どのように出力されると良いのでしょう?
最新Noが0504であれば、0504にデータが無いので、データ表示しない。
1000  1    1
1000  2    2
1001  2    2
1001  1    3
1001  2    1
1003  2    1
1003  1    1
1003  2    3
最新Noが0509であれば、1003にデータが無いので、データ表示しない。
1000  2    2
1001  2    1
1001  1    3
1001  2    2
1004  1    1
1004  2    2
1004  1    1
>最新は0504? 0509?
このテーブル名は年月を表しています。ここでは最新は0504になっていますが、実際は0509が最新のデータになります。番号を付け直したら、並び替えできるということでしたので、0504が最新ということにしています。0504が最新で大丈夫です。

【6651】Re:複数テーブルのデータ集計2
回答  てっちゃん  - 05/10/28(金) 11:57 -

引用なし
パスワード
   ▼チリ子 さん:
>最新Noが0504であれば、0504にデータが無いので、データ表示しない。
>1000  1    1
>1000  2    2
>1001  2    2
>1001  1    3
>1001  2    1
>1003  2    1
>1003  1    1
>1003  2    3
了解です。

4.のクエリーを次のように変更して下さい。
SELECT Query_union.*,
fxMakeGroup([Query_union]![No],[Query_union]![TB],[Query_union]![区分])
AS G
INTO wkTBL_抽出対象
FROM
(
Query_union LEFT JOIN Query_欠ける最小値 ON
Query_union.[No] = Query_欠ける最小値.[No]
)
INNER JOIN [0504] ON
Query_union.[No] = [0504].[No]
WHERE
(
(Query_union.[No] Is Not Null) AND
(Query_union.TB<[Query_欠ける最小値]![TBの最小])
) OR
(Query_欠ける最小値.[No] Is Null)
ORDER BY Query_union.[No], Query_union.TB;
  テーブル[0504]をくっつけて、[0504]にあるものだけを抽出してます。
  [0504]は、「最新」となるテーブルとして下さい。
  また、fxMakeGroupをここで使い、更にテーブル作成クエリーと
  なってます。
  いくつか試したのですが、最後の集計がうまくいかなかったので、
  ワークテーブル「wkTBL_抽出対象」を作る方法に逃げました(^_^;


5.のクエリーも次のようにして下さい。
SELECT [No], 区分, Count(区分) AS カウント
FROM wkTBL_抽出対象
GROUP BY [No], 区分, G
ORDER BY G;
  集計対象が、「Query_抽出対象」から「wkTBL_抽出対象」に
  変更になり、fxMakeGroupも4.で既に使っているので
  こちらでは必要ありません。


以上です。
4.のテーブル作成クエリーを実行した後、5.のクエリーを実行すれば
結果がでてくると思います。

テーブル作成はダメかな?

【6723】Re:複数テーブルのデータ集計2
お礼  チリ子  - 05/11/2(水) 16:03 -

引用なし
パスワード
   ▼てっちゃん さん:

>テーブル作成はダメかな?
テーブル作成、大丈夫です。

いろいろとご指導して頂きありがとうございました。
私の目指すものが見えてきました!!!
これを実際に使用して完成させたいと思います。
本当にありがとうございました(ToT)/~~~

1531 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078229
(SS)C-BOARD v3.8 is Free