Access VBA質問箱 IV

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

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


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

【7267】累計計算について わん 06/2/14(火) 0:49 質問[未読]
【7270】Re:累計計算について 小僧 06/2/14(火) 13:15 回答[未読]
【7271】Re:累計計算について わん 06/2/14(火) 14:28 発言[未読]
【7272】Re:累計計算について 小僧 06/2/14(火) 15:13 発言[未読]
【7273】Re:累計計算について わん 06/2/14(火) 16:31 質問[未読]
【7278】Re:累計計算について 小僧 06/2/15(水) 9:36 回答[未読]
【7282】Re:累計計算について わん 06/2/15(水) 13:07 お礼[未読]

【7267】累計計算について
質問  わん  - 06/2/14(火) 0:49 -

引用なし
パスワード
   【7263】↓に関連する質問ですが、
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=7263;id=access
1スレッドに対し1つの質問と言うことなので
別スレッドにて質問をさせていただきます。

累計計算について教えて下さい。

↓のSQLだと年月日全ての累計になってしまいますが、
SQL
SELECT T.ID, T.得点, T.年月日, T.クラス, (select sum(S.得点) from クエリ as S where val(S.年月) <= val(T.年月日) and S.ID <= T.ID) AS 累計
FROM クエリ AS T
ORDER BY T.ID;

クラス(A・B・C)などに分かれている場合は、
年月日、クラスの両フィールドのグループ毎に累計を出すには
どのようにすれば良いのでしょうか?

教えて頂きたいと思います。
宜しくお願い致します。

【7270】Re:累計計算について
回答  小僧  - 06/2/14(火) 13:15 -

引用なし
パスワード
   ▼わん さん:
こんにちは。

とりあえずこちらの方を…。

>クラス(A・B・C)などに分かれている場合は、
>年月日、クラスの両フィールドのグループ毎に累計を出すには
>どのようにすれば良いのでしょうか?

抽出条件をもう一つ付ける、という事なのでしょうか。

SELECT T.ID,
    T.得点,
    T.年月日,
    T.クラス,
(SELECT Sum(S.得点)
FROM クエリ1 As S
WHERE Val(S.年月日) <= Val(T.年月日) AND
    S.ID <= T.ID AND
    S.クラス = T.クラス) AS 累計
FROM クエリ1 AS T
ORDER BY T.ID;

【7271】Re:累計計算について
発言  わん  - 06/2/14(火) 14:28 -

引用なし
パスワード
   こんにちは。

>抽出条件をもう一つ付ける、という事なのでしょうか。
>
>SELECT T.ID,
>    T.得点,
>    T.年月日,
>    T.クラス,
>(SELECT Sum(S.得点)
> FROM クエリ1 As S
> WHERE Val(S.年月日) <= Val(T.年月日) AND
>    S.ID <= T.ID AND
>    S.クラス = T.クラス) AS 累計
>FROM クエリ1 AS T
>ORDER BY T.ID;

↑と同じことを試してみたのですが希望するものとは
違う結果となりました。

Aの累計のみ、Bの累計のみ、Cの累計のみといった感じにはならないのです。
また、現在は年毎の区切りになっているのですが月毎にはできないでしょうか?
希望は↓のようになるのが理想なのですが無理でしょうか?

   年月    クラス 得点 累計
 2001/01/01  A    50  50
 2001/01/02  A    50  100
 2001/01/01  B    30  30
 2001/01/01  C    40  40
 2001/01/03  A    50  150
 2001/01/02  B    30  60
 2001/01/02  C    40  80
 2001/01/03  C    40  120

宜しくお願いします。

【7272】Re:累計計算について
発言  小僧  - 06/2/14(火) 15:13 -

引用なし
パスワード
   ▼わん さん:
こんにちは。
    
>希望するものとは違う結果となりました。

先ほどの投稿を参考にさせて頂いて

[テーブル1]
クラスID    クラス
1    A
2    B
3    C

[テーブル2]
ID    年月    クラス    得点
1    2001/01/01    A    50
2    2001/01/02    A    50
3    2001/01/01    B    30
4    2001/01/01    C    40
5    2001/01/03    A    50
6    2001/01/02    B    30
7    2001/01/02    C    40
8    2001/01/03    C    40

を用意すると、

SELECT T.ID, T.年月, T.クラス, T.得点, (SELECT Sum(S.得点)
FROM テーブル2 As S
WHERE Val(S.年月) <= Val(T.年月) AND
S.ID <= T.ID AND
S.クラス = T.クラス) AS 累計
FROM テーブル2 AS T
ORDER BY T.ID;


ID    年月    クラス    得点    累計
1    2001/01/01    A    50    50
2    2001/01/02    A    50    100
3    2001/01/01    B    30    30
4    2001/01/01    C    40    40
5    2001/01/03    A    50    150
6    2001/01/02    B    30    60
7    2001/01/02    C    40    80
8    2001/01/03    C    40    120

このような結果になるのですが…。

【7273】Re:累計計算について
質問  わん  - 06/2/14(火) 16:31 -

引用なし
パスワード
   こんにちは。

スイマセン。
どうやら私の勘違いのようでした。
同じ結果になりました。
テーブルから直接でないと同じ結果にならないんですね。

では次のような場合はどうすれば良いのでしょう。
テーブル2のフィールドに「減点」を追加し、
計算式をいれた状態で累計はだせるのでしょうか?

例SQL
SELECT T.ID, T.年月, T.クラス, T.得点, (select sum(S.得点) from テーブル2 as S where val(S.年月) <= val(T.年月) and S.ID <= T.ID and S.クラス <= T.クラス) AS 累計, T.減点, [得点]-[減点] AS 答
FROM テーブル2 AS T
ORDER BY T.ID;

↑の「答」の累計はどうやれば宜しいのでしょうか?
これができれば全て解決されるのですが
宜しくお願いします。

【7278】Re:累計計算について
回答  小僧  - 06/2/15(水) 9:36 -

引用なし
パスワード
   ▼わん さん:
おはようございます。

こちらも SQL の試行錯誤の繰り返しです(笑)

答だけでなく、得点・減点の累計も必要な場合…

SELECT T.ID,
    T.年月,
    T.クラス,
    T.得点,
    (SELECT Sum(S.得点)
    FROM テーブル2 AS S
    WHERE Val(S.年月) <= Val(T.年月) AND
       S.ID <= T.ID AND
       S.クラス = T.クラス) AS 得点累計,
    T.減点,
    (SELECT Sum(S.減点)
    FROM テーブル2 AS S
    WHERE Val(S.年月) <= Val(T.年月) AND
       S.ID <= T.ID AND
       S.クラス = T.クラス) AS 減点累計,
    [得点]-[減点] AS 答,
    [得点累計]-[減点累計] AS 答累計
FROM テーブル2 AS T
ORDER BY T.ID;

クエリの中で再計算させている為、速度に不安がありますね。


答の累計だけを出せれば良いのでしたら、

SELECT T.ID,
    T.年月,
    T.クラス,
    (SELECT Sum(S.得点-S.減点) AS 答
    FROM テーブル2 AS S
    WHERE Val(S.年月) <= Val(T.年月) AND
       S.ID <= T.ID AND
       S.クラス = T.クラス) AS 答累計
FROM テーブル2 AS T
ORDER BY T.ID;


クラスの所だけ 不等号(<=)でなく等号(=)である事に注意して下さい。

【7282】Re:累計計算について
お礼  わん  - 06/2/15(水) 13:07 -

引用なし
パスワード
   小僧さん
こんにちは。

できました。ありがとうございます。

同DB内に似たようなSQLだらけで混乱してしまいました。(^^;;

>クラスの所だけ 不等号(<=)でなく等号(=)である事に注意して下さい。
どうやらご指摘の通り(=)(<=)の違いにより
異なる結果となっていたようです。

>クエリの中で再計算させている為、速度に不安がありますね。
立ち上がりの速度が少し(5秒程度)時間が掛かるようです。
この件に関しては組立て方で何とか解消できそうです。

小僧さんの回答は、
DBを作り上げながら理解していくタイプの私には
実践思考で解りやすく毎回助かっています。

いつもありがとうございます。

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