Access VBA質問箱 IV

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

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


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

【9469】SQLの記述 hiro 07/5/29(火) 15:58 質問[未読]
【9470】Re:SQLの記述 たん 07/5/29(火) 16:48 回答[未読]
【9472】Re:SQLの記述 hiro 07/5/29(火) 17:29 質問[未読]
【9475】Re:SQLの記述 小僧 07/5/30(水) 8:12 回答[未読]
【9477】Re:SQLの記述 hiro 07/5/30(水) 9:07 お礼[未読]

【9469】SQLの記述
質問  hiro  - 07/5/29(火) 15:58 -

引用なし
パスワード
   いつも参考にさせていただいてます。
環境は WinXP Access2000です。

下記のテーブルの

番号  商品名  在庫数
01  A完成品  50
011 A工程1   5
012 A工程2  25
02  B完成品  10
022 B工程2   5

SQLの実行結果が

番号  商品名  在庫数 工程1 工程2
01  A完成品  50  5   25
02  B完成品  10       5

となるように記述するにはどうすればよいのでしょうか?

クロス集計クエリで作成してみたのですが実行結果が

番号  商品名  在庫数 工程1 工程2
01  A完成品  50
011 A工程1       5
012 A工程2          25
02  B完成品  10
022 B工程2           5

となります。
ご存知の方おられましたら教えていただけますでしょうか。
よろしくお願いします。

【9470】Re:SQLの記述
回答  たん  - 07/5/29(火) 16:48 -

引用なし
パスワード
   >番号  商品名  在庫数
>01  A完成品  50
>011 A工程1   5

が少なくとも、同じ01として処理させたいなら、
そういう形にクエリ上で加工しておかなければ、

クロス集計クエリ(前述のクエリとは別)で

番号が5種類になるのは当然。

【9472】Re:SQLの記述
質問  hiro  - 07/5/29(火) 17:29 -

引用なし
パスワード
   たんさん
返信ありがとうございます。
おしゃる通りですね。

クロス集計クエリで

TRANSFORM Sum(テーブル1.在庫数) AS 在庫数の合計
SELECT Mid([番号],1,2) AS 区分
FROM テーブル1
GROUP BY Mid([番号],1,2)
ORDER BY Mid([番号],1,2)
PIVOT Mid([番号],3,1);

のようにしたら、ほぼ思っている感じになりました。
でも商品名を入れると商品名でグループ化されるので
結局同じ結果になりますね。
出来れば商品名も表示したいのですが、良い方法あれ
ば教えていただければと思います。

【9475】Re:SQLの記述
回答  小僧  - 07/5/30(水) 8:12 -

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

> 番号  商品名  在庫数 工程1 工程2
> 01  A完成品  50  5   25
> 02  B完成品  10       5


この形をクロス集計クエリを最終形にされたいのであれば、
その基になるクエリはどの様なものが必要かを考えてみましょう。


番号 商品名  xxx   数量
01 A完成品 在庫数  50
01 A完成品 工程1  5
01 A完成品 工程2  25
02 B完成品 在庫数  10
02 B完成品 工程2  5

こんなデータが必要になってくるはずです。

SELECT Left([番号],2) AS 種別,
    テーブル1.商品名,
    IIf(Len([番号])=2,"在庫数","工程" & Right([番号],1)) AS xxx, テーブル1.在庫数 AS 数量
FROM テーブル1;


このクエリをクロス集計し、Q_Temp という名前で保存します。

TRANSFORM Sum(テーブル1.在庫数) AS 数量
SELECT Left([番号],2) AS 種別
FROM テーブル1
GROUP BY Left([番号],2)
PIVOT IIf(Len([番号])=2,"在庫数","工程" & Right([番号],1));


このクエリと基のテーブルを結合します。
SELECT Q_Temp.種別,
    テーブル1.商品名,
    Q_Temp.工程1,
    Q_Temp.工程2,
    Q_Temp.在庫数
FROM Q_Temp
INNER JOIN テーブル1 ON Q_Temp.種別 = テーブル1.番号;


こんな感じで結果を出せますが、あくまでも結果が返るというだけであり
できる事でしたら基のテーブル構造を見直されたほうが良い気がします。


T_商品マスタ
商品コード 商品名
01     A
02     B


T_状態マスタ
状態コード  状態名
00      完成品
01      工程1
02      工程2


T_商品テーブル
ID 商品コード 状態コード 数量
1  01     00      50
2  01     01      10
3  01     02       5
4  02     00      25
5  02     02       5


上記は1例ですが、今までのテーブル構成よりはSQLでの算出をやりやすくなるかと思われます。
興味を持たれましたら「テーブルの正規化」というキーワードを基に
色々Web検索をされてみてはいかがでしょうか。

【9477】Re:SQLの記述
お礼  hiro  - 07/5/30(水) 9:07 -

引用なし
パスワード
   小僧 さん:

返信ありがとうございます。
教えていただいた通り作成し、思った結果になりました。
確かにテーブルを作る段階である程度想定しておかないと
いけませんね。とても参考になりました。
ありがとうございました。

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