Access (一般機能)

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

 
(Windows 10 Home : Access 2016)
縦持ちから横持ち?への変更
投稿日時: 20/09/17 06:52:47
投稿者: かつん

現在下記のようなデータの持ち方をしているテーブルがあります。

エリア	N1	N2	時間	速度
50000	50	100	00	92
50000	50	100	01	91
50000	50	100	02	88

 
そして下記のようなテーブルに変えたいと考えております。
エリア	N1	N2	時間00	時間01	時間02
50000	50	100	92	91	88

 
やり方が特に思いつかないので、ExcelにエクスポートしてVBAで加工しようと思ったのですが、その前にもっと簡単な方法があるのかもしれないと思い質問させていただきました。
また、そもそもこの様に変化させる事を日本語でどう表現すればいいのかも分からないので、検索も難しいような状況です。一番近い言葉として「縦持ち→横持ち」なのかなと思いその様な表題としました。
 
何方か知恵をお貸しいただければ幸いです。

回答
投稿日時: 20/09/17 09:37:47
投稿者: Suzu

「簡単」が個人差に拠る事なるので、一概に言えないのですが
近い結果であれば、クロス集計クエリで実現できますよね。
 
TRANSFORM Min(速度)
SELECT エリア, N1, N2
FROM テーブル
GROUP BY エリア, N1, N2
PIVOT 時間;
 
【TRANSFORM Sum(速度)】の部分は、
エリア、N1、N2、時間 が 同一 の レコードが存在した場合の速度をどう計算するか
により 変えましょう。
 
 
ただし Accessの制限として、フィールドの最大数 255 が挙げられます。
「エリア」、「N1」、「N2」 をフィールドとして持つのですから、
時間の種類は252以下である必要があります。
 
それを超えるのであれば、Excelで処理した方が早いでしょう。
 
 
フィールド名に「時間○○」の様にしたいのであれば、
クロス集計クエリをソースにして、クエリを作成し対応しましょう。
 
その場合、「時間」の種類が可変である際には、
クロス集計を元にしたクエリを編集する必要があります。
 
そこまでを自動化したいのであれば、
VBAを使用し、
・クロス集計クエリからフィールド名
・SELECT 時間 FROM テーブル GROUP BY時間 で得られる 時間の値
のどちらかから 時間の種類を得て
クロス集計を元にしたクエリを生成します。
 
 
VBAを使用するなら
クロス集計クエリをではなく、
サブクエリ(または広域関数)を使用する クエリのSQLを生成する事も可能です
ただし、レコード件数や、時間の種類が増えるとそのクエリの速度低下の懸念がありますね。

投稿日時: 20/09/22 21:16:57
投稿者: かつん

>Suzuさん
 
お返事が遅くなり申し訳ありません。
「クロス集計クエリ」という言葉は聞いたことがあったのですか、何のことかは知りませんでした。調べてみて、クロス集計クエリウィザードに従って操作していたら自分のやりたいことが簡単に出来てしまいました。聞いてみて良かったです。わざわざフィールド数の制限や、時間が可変になる場合まで想定いただいて大変恐縮です。
 
この度はご丁寧にありがとうございました。