- ベストアンサー
SQLデータの表示方法とテーブル変換
- SQLでデータベースからデータを読み込んで表示する方法と、テーブルデータを特定の形式に変換する方法について説明します。
- SQLを使用してデータベースからデータを読み込み、指定期間内の商品名と商品種類が同じレコードの件数をカウント表示します。
- 表示されるデータは、商品名、商品種類、件数です。しかし、同じ商品名で異なる商品種類のデータが別のレコードとして表示されるため、商品名と種類ごとにカウントした表の形式に変換したいと思っています。
- みんなの回答 (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 に 相当する関数です。
その他の回答 (2)
- nda23
- ベストアンサー率54% (777/1415)
実際の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システムでこれをやるには 大変面倒なクエリになります。
お礼
大変丁寧なご説明ありがとうございます。 早速試して見たのですが 「SELECTステートメントまたはレコードセットを返すストアードプロシージャを入力してください」とエラーが出てしまいます。 ドリームウィーバーCS3のレコードセット(詳細)SQL入力欄に記入する形で作成しているのですが どうやらTRANSFORMは使えないようです。 詳しく教えていただいたのに申し訳ありません。
- nda23
- ベストアンサー率54% (777/1415)
データベースは何を使っていますか? Accessの場合はTransformで作成 できます。他のDBですと、別の手段 になります。
お礼
ご回答ありがとうございます。 データベースは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を)したいのですがうまくいきません。 良い方法があればお教え願えるでしょうか?
お礼
お礼遅くなりすみません。 いつも丁寧なご回答ありがとうございます。 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の値ごとに列が作成できません。 色々な方法考えて頂いたのに申し訳無いです。