SQLデータの表示方法とテーブル変換

このQ&Aのポイント
  • SQLでデータベースからデータを読み込んで表示する方法と、テーブルデータを特定の形式に変換する方法について説明します。
  • SQLを使用してデータベースからデータを読み込み、指定期間内の商品名と商品種類が同じレコードの件数をカウント表示します。
  • 表示されるデータは、商品名、商品種類、件数です。しかし、同じ商品名で異なる商品種類のデータが別のレコードとして表示されるため、商品名と種類ごとにカウントした表の形式に変換したいと思っています。
回答を見る
  • ベストアンサー

SQLで抽出したデータの表示方法

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を入力)の形にしたいと考えております。 最終的にテーブルデータをテキストデータとして書き出したいので この表の形にさえ出来れば方法は問いません。 何か良い方法はないでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.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 に 相当する関数です。

yaritukai
質問者

お礼

お礼遅くなりすみません。 いつも丁寧なご回答ありがとうございます。 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の値ごとに列が作成できません。 色々な方法考えて頂いたのに申し訳無いです。

その他の回答 (2)

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

実際の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システムでこれをやるには 大変面倒なクエリになります。

yaritukai
質問者

お礼

大変丁寧なご説明ありがとうございます。 早速試して見たのですが 「SELECTステートメントまたはレコードセットを返すストアードプロシージャを入力してください」とエラーが出てしまいます。 ドリームウィーバーCS3のレコードセット(詳細)SQL入力欄に記入する形で作成しているのですが どうやらTRANSFORMは使えないようです。 詳しく教えていただいたのに申し訳ありません。

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

データベースは何を使っていますか? Accessの場合はTransformで作成 できます。他のDBですと、別の手段 になります。

yaritukai
質問者

お礼

ご回答ありがとうございます。 データベースは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を)したいのですがうまくいきません。 良い方法があればお教え願えるでしょうか?

関連するQ&A

  • 重複データを含むSQL抽出方法

    sqlserver2008で、以下のようなテーブルから、全体のレコード件数を取得したいと思います。 但し条件として、 ・b列とc列が重複しているものは、d列の最新の日付のものを残す。 ・b列が同じものはそのままカウント ・c列が同じものはそのままカウント a列|b列 |c列 |d列 ---------------------------- 1|host1 |100 |2010/10/01 2|host2 |101 |2010/10/01 3|host3 |102 |2010/08/01 4|host3 |102 |2010/10/01 5|host4 |104 |2010/10/01 6|host5 |104 |2010/10/01 7|host5 |105 |2010/09/01 8|host6 |106 |2010/08/01 9|host6 |106 |2010/10/01 10|host7 |107 |2010/10/01 上記の条件実行し、以下のような結果(件数)を求めたい場合どのようなSQLになりますでしょうか。 a列|b列 |c列 |d列 結果(8件) ---------------------------- 1|host1 |100 |2010/10/01 ○ 2|host2 |101 |2010/10/01 ○ 3|host3 |102 |2010/08/01 4|host3 |102 |2010/10/01 ○ 5|host4 |104 |2010/10/01 ○ 6|host5 |104 |2010/10/01 ○ 7|host5 |105 |2010/09/01 ○ 8|host6 |106 |2010/08/01 9|host6 |106 |2010/10/01 ○ 10|host7 |107 |2010/10/01 ○ select文の中にselect文を使ったりするのでしょうか。 内部結合などイマイチ理解できていないためよろしくお願いします。

  • 1つのSQLで2段階の抽出を行いたい

    恐らくそれほど複雑なSQLではないと思いますが、中々SQLが作成できず困っています。 回答いただければ嬉しいです。 以下のテーブルがあったと仮定します。 テーブル名:  売上げ明細 カラム:  ・商品ID … 売上げ明細なので一意ではありません  ・単価 … 同じ商品IDでも、レコードによって単価は異なります  ・数量 … 1~5の整数のみとします 実際のデータは以下の通りです。 商品ID,単価,数量 1001,50,2 1001,60,5 1002,90,3 1003,60,5 1003,80,4 1003,90,1 1004,60,3 上記データを以下の通り抽出するには、どのようなSQLを組めばいいでしょうか? 1.まず各商品IDの中から単価が最大のレコードだけを取り出す 商品ID,単価,数量 1001,60,5 1002,90,3 1003,90,1 1004,60,3 2.次に数量でgroup by して、件数をカウントする 数量,件数 1,1 3,2 5,1 1つのSQL文で2の結果が得られれば、途中の抽出条件は特に問いません。 ちなみにMySQL5を使っています。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • DataGridViewでのデータ抽出について

    C#からAccessデータベースを呼び出し、それをDataGridViewに表示しました。 その上で、条件に合うレコードのみを表示するコードを書こうとしました。 元のAccessのフィールドにはテキスト型のデータが入っています。         DataView dView; dView = new DataView(dSet.Tables["t_" + (テーブル名)] , "フィールド名=" + (文字列型変数), "", DataViewRowState.CurrentRows); dataGridView.RowHeadersVisible = false; this.dataGridView2.DataSource = dView; これをデバッグすると、2行目で、EvaluateExceptionはハンドルされませんでした。というエラーが出ます。 列[「(文字列型変数)]は見つかりません」という内容です。 これを回避して、フィールドに特定の文字列が入っているレコードを抽出して、DateGridViewに表示させる 方法はないでしょうか。 ちなみに数値型のレコードを抽出することはできているレベルです。 また、フィールドに日付が入っているような場合、ある期間内のレコードを抽出するやり方を ご存知のかたがおりましたら、お教え願います。 (直接のやり方でなくても、「この本が良い」というようなアドバイスでも大いに助かります)。 どうかよろしくお願いします。

  • エクセルで、フィルタでデータを抽出した値を表示させるには・・

    仕事でexcel2000を使っています。 例えば、3行目より、a列に社名 b列に番号 c列に商品名が入っているとします。オートフィルタで、番号を一つ選ぶと、社名と商品名も表示されます。その表示された社名を、1行目に自動的して表示させえるにはどうしたらよいでしょうか?(宛先としたいのです)フィルタで抽出されるデータなので、毎回、出てくる会社が違うし、手で入力するかコピーすればいいのでしょうが、処理件数が多いと面倒だったりするもので。何か、簡単に出来る数式もしくは方法があれば教えてください。 よろしくお願いします。

  • Excelで、出勤人数の集計方法は?

     現在、私の手元に工場の作業日報のデーターベースがあります。  いつ、誰が、どんな作業を、何時から、何時まで行っていたかというデーターが約半年分、行数にして1万5千行ほどあります。    このデーターベースから、日付毎の出勤人数を集計したいのですが、集計やピポットテーブルを使用しても上手く往きません。  A列に日付、B列に作業者名、C列以降に作業名や時間が入力されているのですが、一人が一日に複数の作業を行った場合、同じ日付に同じ作業者名が幾つもダブって入力されています。  集計やピポットテーブルを使用しても、例えば同じ日付に同じ作業者名が3回登場すると、1とカウントせず、3とカウントしてしまいます。  このように、データーの個数を集計するのではなく、データーが何種類有るかを集計する方法は無いのでしょうか。詳しい方、どうかご教授下さい。  では。

  • データベースとデータの抽出について

    データベースとデータの抽出について エクセル2003で以下のような、表を作っています。 データは現在、A列に10000万件程度入っています。 4列目の購入日付データの年、月、日がそれぞれのセル(D2、E2、F2) に分割入力されています。 このデータベースから、氏名と購入日付を基準キー にして、顧客NOと購入日付(1つのセルに結合)、 購入商品を抽出し、シート2に転記していきたいです。 抽出方法は、シート2に以下のような形で検索  表示したいです。 (シート2) 氏名(B1に表示)→C1に入力 抽出開始年月日(D1に表示)→年はE1、月はG1、日はI1に入力  抽出終了年月日(D2に表示)→年はE2、月はG2、日はI2に入力 検索後、表示される顧客NOと購入日付、購入商品は 同じシート2の以下のセルに表示したいです。 顧客NO(L1に表示)→L2から下に表示 購入日付(M1に表示)→M2から下に表示 購入商品(N1に表示)→N2から下に表示 したいです。 日付が分割入力されているため、抽出がうまくできません。 氏名、または名字だけでうまく検索できるコードはあるでしょうか。 どうぞよろしくお願いします。

  • エクセルで日付データの比較/判定でカウント

    エクセルで日付データの比較/判定でカウント A1に 2006/2/22 A2に 2006/2/23 ---------- という日付データが入っている。 またc1~c4に c1:2006/2/24+時間  (例2006/2/24 07:18) c2:2006/2/23+時間 c3:2006/2/23+時間 c4:2006/2/22+時間 ---------- という時刻まで含む日付データが入っている。 (処理)A1とC列のデータの日付けが同じものは1つc4だけなのでカウントし1件とその横の B列(B1)にカウント件数を表示したい。 B1に書く式はどのようにすればよいか。よろしくお願いします。

  • 2つのシートから合致するデータの抽出方法

    Excelについて質問させて頂きます。 二つのシートにある表からA列B列が合致する行だけを表示させたいと思います。 例;A列→商品名、B列→商品コード、C列以降→在庫数など。 シート1には、現在も販売されているもの。 シート2には、過去の分も販売されていたもの。 があります。 どのような解決策がありますか? データベースには10000件以上のデータがあるので一つずつ照合していけません。 どなたかExcelの関数に詳しいかたがいらっしゃいましたらご教授頂けましたら幸いです。 宜しくお願い致します。

  • Excelデータの抽出について

    Excelについて質問いたします。 Excelにて複数条件にマッチするデータを表示させたいのですが、どのようにすればいいでしょうか? 表はA列から順に、日付、部署名、商品名、入荷数、記号、配達1、記号、配達2、記号、配達3、記号、残りという列にしています。 各行を分かりやすくするために、商品名ごとにセルの背景色を変えています。 現在は、商品名列を選択し、色フィルターを使って、任意の商品名の行を抽出をしています。 現在の抽出条件であります、商品名の抽出に、残り列の数字が○○以下(未満)または残り列の数字が0以外という抽出を追加したいです。 つまり、商品名が○○かつ残り数字が0以外などです。 商品名、残り列の抽出条件につきましては、使用頻度の関係で、条件式の入力よりは一覧から選択の方がいいです。

  • エクセルのデーター抽出で悩んでおります、皆様のお知恵をお貸しください。

    エクセルのデータ抽出で悩んでおります、皆様のお知恵をお貸しください。 データベースとして作ってある表で、”列A”に入っている日付以上(形式2009/11/27)、”列B”に入ってる日付以下と言う条件で、”列D”から”列R”に入っている日付データを探し、”列C”に入れるという事をしたいのですが、出来るだけ簡単な方法があればお教え下さい。 〔列A2009/11/27〕 〔列B2011/1/27〕 〔列CXXXX/XX/XX〕 〔列D~Rは日付データ〕 列Aに入っている日付以上、列Bに入っている日付以下という条件で、列D~列Rに入っている日付データの中から条件に合致するデータを探し、空白の”列C”に合致したデータを入れるというができますでしょうか。 (あくまでもデータベースとして表が出来ているので、並べ替えてオートフィルタ機能を使うという事はできません。)