Access (VBA)

Access VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(指定なし : 指定なし)
区分1・2・3の並びで2のみ複数行有るテーブルを1つに纏めれますか?
投稿日時: 23/01/23 15:55:24
投稿者: おそまつ

区分1・2・3の並びで2のみ複数行有るテーブルを1つに纏めれますか?
 
 
(入力テーブル)
区分 オートナンバー   項目2   項目3
1    1       12/1   A社
2    2       200    市バス 
2    3       400    JR東 
2    4       400    地下鉄
3    5       3      1000
1    6       12/3   B社
2    7       300    JR東
2    8       400    地下鉄
3    9       2      700
1   10       12/4   C社
2   11       600    JR東
3   12       1      600
 
 
(出力テーブル)
200   市バス   12/1  A社  1000
400   JR東   12/1  A社  1000
400   地下鉄   12/1  A社  1000
300   JR東   12/3  B社   700
400   地下鉄   12/3  B社   700
600   JR東   12/4  C社   600
 

回答
投稿日時: 23/01/24 10:21:15
投稿者: Suzu

考え方だけ。
 
 
200   市バス
400   JR東
400   地下鉄
300   JR東
400   地下鉄
600   JR東

SELECT 項目2, 項目3 FROM テーブル名 WHERE 区分=2
 
あと、
12/1 は
・区分=1
・自レコード より オートナンバーの値が小さいうちの最大値
の 項目2
 
A社 は
・区分=1
・自レコード より オートナンバーの値が小さいうちの最大値
の 項目3
 
 
ここまでは、DLookUp と DMax関数の組み合わせ
 
 
1000 は
・区分=3
・自レコード より オートナンバーの値が大きいうちの最小値
の 項目3
 
これは、DLookUp と DMin関数の組み合わせ

投稿日時: 23/01/26 15:17:07
投稿者: おそまつ

SQL一発で取得するのは無理なので。
レコード移動しながら処理するしか無理ってことでしょうか?
 
 
selectで区分=2を取得する。
 
順次ループで取得
Do until rs.EOF
 ・区分=1
  DMaxで自レコード より オートナンバーの値が小さいうちの最大値
  DLookUp のデータを取得
 
 ・区分=3
   DMinで自レコード より オートナンバーの値が大きいさいうちの最小値
  DLookUp のデータを取得
 
 ・区分1、2、3をそれぞれ取得
  rs.MoveNext
loop

投稿日時: 23/01/26 15:23:52
投稿者: おそまつ

SQL一発で取得するのは無理なので、
区分=3のデータが不要な場合は順次処理するってことでしょうか?
 
 
selectで区分=1と2を取得する。
  
順次ループで取得
Do until rs.EOF
 ・区分=1
   データを取得して退避
  
 ・区分=2
    データを取得して区分=1の退避データと合体
 
  rs.MoveNext
loop

回答
投稿日時: 23/01/26 16:07:22
投稿者: sk

引用:
(出力テーブル)
200   市バス   12/1  A社  1000
400   JR東   12/1  A社  1000
400   地下鉄   12/1  A社  1000
300   JR東   12/3  B社   700
400   地下鉄   12/3  B社   700
600   JR東   12/4  C社   600

以上のような結果を得るだけなら、例えば次のようなクエリを
作成なさればよろしいでしょう。
 
( SQL ビュー)
-------------------------------------------------------------------
SELECT [入力テーブル].[項目2] AS [運賃],
       [入力テーブル].[項目3] AS [利用交通機関],
       (SELECT TOP 1
               tmp.[項目2]
        FROM [入力テーブル] tmp
        WHERE tmp.[区分] = 1
          AND tmp.[オートナンバー] < [入力テーブル].[オートナンバー]
        ORDER BY tmp.[オートナンバー] DESC) AS [出張日付],
       (SELECT TOP 1
               tmp.[項目3]
        FROM [入力テーブル] tmp
        WHERE tmp.[区分] = 1
          AND tmp.[オートナンバー] < [入力テーブル].[オートナンバー]
        ORDER BY tmp.[オートナンバー] DESC) AS [出張先名称],
       (SELECT TOP 1
               tmp.[項目3]
        FROM [入力テーブル] tmp
        WHERE tmp.[区分] = 3
          AND tmp.[オートナンバー] > [入力テーブル].[オートナンバー]
        ORDER BY tmp.[オートナンバー] ASC) AS [運賃合計]
FROM [入力テーブル]
WHERE [入力テーブル].[区分] = 2
ORDER BY [入力テーブル].[オートナンバー];
-------------------------------------------------------------------
 
出来れば上記のようなクエリを作るよりも、正規化された 2 つのテーブルに
変換する仕組みを検討された方がよいでしょう。

投稿日時: 23/01/27 20:46:46
投稿者: おそまつ

SQL ビューをヒントに
最大と最小求めてから自結合したらいけました。