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

お世話になります。
現在EXCEL VBAとACCESSでデータを表示する調査をしております。

以下のように、複数行を一列に表示する場合の実現方法が分からず悩んでおります。(SQLはあまり詳しくありません。)
悩みどころは2点あります。

 (1)SQLでどのようにデータを取得すればよいか?
  (複数回SQLを発行しなければいけないのか?など)
 (2)取得したデータの表示方法
  (2次元配列で持たせるのが良いのか?など)

どなたかご教示いただけませんでしょうか?
よろしくお願い致します。

--------------------------------------
【環境】
 Windows XP
 EXCEL2003
 Access2000

 社員テーブル構成
  1.id(key1)  :社員コード
  2.code(key2) :言語
  3.stutus    :状態(1:習得,2:未修得)

 EXCELで以下の表示を実現したいと考えてます。
  (1)社員テーブルを読み込み、セルにヘッダー行と明細行を出力する。
  (2)ヘッダー行には[code]を重複排除して横一列に表示する。
  (3)明細行には[id]毎に出力する。
  (4)[status]が"1"なら"○"に"2"なら"×"、それ以外は"-"にする。
   ([code]は各idに必ずしも存在しない)

 ■テーブルイメージ
   id   code  status
  00001  VBA  1
  00001  CBL  1
  00002  VBA  2
  00002  JAV  2
  00002  RPG  1
  00003  PHP  1
  00003  CBL  2

 ■出力イメージ
     VBA  CBL  JAV  RPG  PHP
 00001  ○  ○   -   -   -
 00002  ×  -   ×   ○   -
 00003  -  ×   -   -   ○
--------------------------------------

A 回答 (2件)

[code]は各idに必ず存在するように加工してから、クロス集計クエリを使用すればいかがでしょうか?かなり回りくどいやり方になりますけれども。


表示するマークを保存したtbl2を作ります。
クエリ: queIDとクエリ: queCDで、IDとcodeを抽出します。
クエリ: queIDCDで、IDとcodeの組み合わせを作成します。
クエリ: queTbl1で、IDとcodeの組み合わせに対するstatusを取得します。
クエリ: queDispで、おまじないをしておきます(汗)
(NZ関数を通すと必ず文字になるのかな?これがないとqueALLで「型が一致しません」というエラーになる・・・。)
クエリ: queALLで、[status]をエンコードします。
クエリ: queAllのクロス集計で、クロス集計を行ないます。


tbl2
-----------
statusdisp
0-
1○
2X
------------

クエリ: queID
------------
SELECT DISTINCT [tbl].[id]
FROM tbl;
------------

クエリ: queCD
------------
SELECT DISTINCT [tbl].[code]
FROM tbl;
------------

クエリ: queIDCD
------------
SELECT [queID].[id], [queCD].[code]
FROM queCD, queID;
------------

クエリ: queTbl1
------------
SELECT [queIDCD].[id], [queIDCD].[code], nz([status],0) AS sts
FROM queIDCD LEFT JOIN tbl ON ([queIDCD].[code]=[tbl].[code]) AND ([queIDCD].[id]=[tbl].[id]);
------------

クエリ: queDisp
------------
SELECT nz([status],0) AS sts, tbl2.disp
FROM tbl2;
------------

クエリ: queAll
------------
SELECT queTbl1.*, queDisp.disp
FROM queDisp INNER JOIN queTbl1 ON queDisp.sts = queTbl1.sts;
------------

クエリ: queAllのクロス集計
------------
TRANSFORM First([disp])
SELECT [id]
FROM queAll
GROUP BY [id]
PIVOT [code];
    • good
    • 0
この回答へのお礼

お返事遅くなりましてすみませんでした。
想定していた表を作ることができました。
ありがとうございます。

ご教示いただいた各クエリを理解してから
応用させていただきます。

...SQL文をガリガリ書こうとすると
大変なことになりそうですね。

お礼日時:2009/02/22 22:12

クロス集計クエリでどうでしょうか?

    • good
    • 0
この回答へのお礼

回答ありがとうございます。
「クロス集計クエリ」が分からなかったので、
調べて試してみたところ、思った表になりました。

TRANSFORM First([tbl].[status])
SELECT [tbl].[id]
FROM tbl
GROUP BY [tbl].[id]
PIVOT [tbl].[code];

あとは[status]をエンコードすれば良いのですが、
どのようにすれば良いのか調査中です。

お礼日時:2009/02/15 09:10

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