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

VBcsript(asp)で作ったページにデータベースからデータを読み込んで表示しております。
テーブル名は「Syouhin」でフィールドは「SNo」(商品No)「SName」(商品名)「SCat」(商品種類)「ODate」(日付)です。
以下のようなSQL文で指定期間内(ODATE)で商品名と商品種類が同じレコードの数(件数)をカウント表示させました。

SELECT SName,SCat, COUNT(*)
FROM Syouhin
WHERE ODate between MMColParam% AND MMColParam2 GROUP BY SName,SCat;

*MMColParam%及び同2にはテキストボックスで日付を代入して期間を指定しております。

表示している内容は
「商品名」「商品種類」「件数」(カウントした)です。
商品種類には1~5の数値が入るのですが、この作成方法だと表示が

「商品1」「1」「3」
「商品1」「2」「5」
「商品1」「4」「9」
「商品4」「2」「8」
「商品8」「1」「12」

のように同じ「商品1」で「商品種類」が違うデータが違うレコードになってしまいます。
「商品名」&「商品種類」別でカウントはしたいのですが、表記は

「商品1」「3」「5」「0」「9」「0」
「商品4」「0」「8」「0」「0」「0」
「商品8」「12」「0」「0」「0」「0」


1列目に「種類1」のカウント、2列目に「種類2」のカウント~5列目に「種類5」のカウントが入った表にしたいと思っています。(その際、もとのデータベースにその「商品種類」が無い場合(レコードセットで抽出されない場合)は0を入力)の形にしたいと考えております。

最終的にテーブルデータをテキストデータとして書き出したいので
この表の形にさえ出来れば方法は問いません。
何か良い方法はないでしょうか?

A 回答 (3件)

ドリームウィーバーは使ったことが


無いのですが、Access本体の
クエリビルダでは使えると思います。
次に思いつく手は二つあります。

一つはAccessにTransformクエリを
作成しておき、"SELECT * FROM クエリ"
というSQLで開く。こちらは条件の反映が
難しいです。別途、条件テーブルを使って、
結合させる必要があるかも知れません。

もう一つは条件で集計する方法です。
SELECT SName,
SUM(IIf(SCat=1,1,0)),
-- 中略 --
SUM(IIf(SCat=5,1,0))
FROM Syouhin
WHERE ~
GROUP BY SName

もしかして、IIfはAccess特有の関数
なので、通用しないかも知れません。
Oracleで言うDECODEやCASE WHEN に
相当する関数です。
    • good
    • 0
この回答へのお礼

お礼遅くなりすみません。

いつも丁寧なご回答ありがとうございます。

SUM(IIf(SCat=1,1,0)),~
は構文エラー(未定義の関数)で駄目でした。
代わりに

SELECT SName,SCat,
SUM(Switch(SCat=1,1,Scat=2,1,SCat=3,1,Scat=4,1,SCat=5,1, True,0))
FROM claim
GROUP BY SName,SCat;

で作成すると問題ないのですが、これだと当然最初のCOUNTを使った時と同じ結果になってしまします。
どうしてもSCatの値ごとに列が作成できません。

色々な方法考えて頂いたのに申し訳無いです。

お礼日時:2011/02/10 03:30

実際のSQLは以下の通りです。



TRANSFORM Nz(Count(*),0) AS X
SELECT SName
FROM Syouhin
GROUP BY SName
PIVOT SCat IN (1,2,3,4,5)

SELECT に続く項目は行見出し、
PIVOT句に続く項目は列見出し、
TRANSFORM直後が値です。
値はグループ化項目であっては
ならないという規則があります。
今回はレコード数なのでOKです。
PIVOT句にIN条件を付けると、
列数が固定され、データが存在
しない所はNullになります。
そこで、Nz(~,0)でNullなら0に
なるようにしています。

TRANSFORMは私の知る限りでは
Accessにしかありません。
他のDBシステムでこれをやるには
大変面倒なクエリになります。
    • good
    • 0
この回答へのお礼

大変丁寧なご説明ありがとうございます。

早速試して見たのですが
「SELECTステートメントまたはレコードセットを返すストアードプロシージャを入力してください」とエラーが出てしまいます。

ドリームウィーバーCS3のレコードセット(詳細)SQL入力欄に記入する形で作成しているのですが
どうやらTRANSFORMは使えないようです。
詳しく教えていただいたのに申し訳ありません。

お礼日時:2011/02/07 17:20

データベースは何を使っていますか?


Accessの場合はTransformで作成
できます。他のDBですと、別の手段
になります。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

データベースはAccessです。
IISとODBCを使っています。
Trannsformですか、勉強不足で知りませんでした。

列をまとめるのにPIVOTを使うみたいですが、うまくいきません。
「商品種類」は1~5の数字しか入らないので、

「商品名」「種類1」「種類2」「種類3」「種類4」「種類5」
  商品1   3   5    0    9    0
  商品4   0   8    0    0    0
  商品8  12   0    0    0    0

のように行は商品名で分けて列は種類別にカウントした数値を表示(無い場合は0を)したいのですがうまくいきません。
良い方法があればお教え願えるでしょうか?

お礼日時:2011/02/06 19:35

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