ユニークなデータの件数を取り出すSQL文

このQ&Aのポイント
  • ユニークなデータの件数を取り出すためのSQL文の作成方法を教えてください。
  • DATE1、DATE2、DATE3のいずれかが同じ場合に行を取り出し、カウントする方法についても教えてください。
  • テーブルのデータをCDのみ取り出す際には、どうすれば良いでしょうか。
回答を見る
  • ベストアンサー

ユニークなデータの件数を取り出すSQL文

下記のようなテーブルから ユニークなデータの件数を取り出すクエリを作成したいのですが、どうもわかりません。 教えてください!宜しくお願い致します。 NO | CD1 | DATE1 | CD2 | DATE2 | CD3 | DATE3 1 111 20120301 222 20130301 333 20130303 2 111 20120301 222 20130301 333 20130303 3 222 20120301 333 20130301 4 222 20120301 333 20130301 5 333 20120301 444 20130301 555 20130302 6 333 20120301 444 20130301 555 20130303 7 333 20120301 8 333 20120302 というテーブルがあって、 この中で DATE1、DATE2、DATE3のいずれかが、 同じであれば、行を取り出しカウントする。 1項目しかデータがなければ、単純にカウントする。 取り出しはCDのみ。 上記であれば、 COUNT | CD1 | CD2 | CD3 2 111 222 333 2 222 333 2 333 444     ※こちらはDATE3が異なるのでCD3は取り出さない。 2 333

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

  • ベストアンサー
  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.1

NOが主キー、CDとDATEはCD1・DATE1から順に設定されていくという前提で、 select COUNT(*), CD1, CD2, CD3 from ( --DATE1、DATE2、DATE3の全てが一致 select T1.CD1, T1.CD2, T1.CD3 from T T1 where exists ( select * from T T2 where T1.NO <> T2.NO and (T1.CD1 = T2.CD1 and T1.DATE1 = T2.DATE1) and (T1.CD2 = T2.CD2 and T1.DATE2 = T2.DATE2) and (T1.CD3 = T2.CD3 and T1.DATE3 = T2.DATE3) ) union all --DATE1、DATE2のみが一致 select T1.CD1, T1.CD2, null from T T1 where exists ( select * from T T2 where T1.No <> T2.NO and (T1.CD1 = T2.CD1 and T1.DATE1 = T2.DATE1) and (T1.CD2 = T2.CD2 and T1.DATE2 = T2.DATE2) and ((T1.CD3 is null and T2.CD3 is null) or ((T1.CD3 = T2.CD3) and ((T1.DATE3 <> T2.DATE3)))) ) union all --DATE1のみしかデータがない select T1.CD1, null, null from T T1 where T1.CD2 is null ) group by CD1, CD2, CD3; とか。 やりたいことを正しく理解できているか分かりませんが。

boooone
質問者

お礼

ありがとうございました。バッチリです。

関連するQ&A

  • 修正したデータの件数を知りたい。

    アクセス2000、エクセル2000で作成したデータがあります。 どちらのソフトでもいいのですが、修正したデータの件数を調べる方法はありますか。 入力したデータと、修正して元データをなおしたデータとを比べてどこかが修正してあったら、カウント1としていきたいのです。 データは約8万件あるため、目で見るには限界があります。 データの項目は16項目です。

  • 複数テーブルでの件数検索について

    Oracle上の2つのテーブルからの条件でマッチする件数をSQLで作成しています。 内容としては、テーブルAの区分=1 かつ テーブルBの種別がスペースの件数です。 テーブルAの該当するデータは10件中3件、テーブルBの該当するデータは50件中15件で、本来両方がマッチするのは2件です。 SELECT COUNT(*) FROM テーブルA,テーブルB WHERE テーブルA.区分 = '1' AND テーブルB.種別 = ' ' ; 上記のSQL文で件数をカウントしたのですが、どうも結果では30件とカウントされてしまいます。 なんとか2件として結果を出したく、参考資料を調べているところなのですが、今のところ参考になる文献が見つからず悩んでます。もし簡単にカウントできるSQLがあったり、分かる方がいれば手助けして頂きたいと思い、今回投稿しますのでご教授賜りたく思います。よろしくお願いします。

  • 1個のSQL分で2種類以上の件数値を取得する

    SQL分の記述で質問なんですが、 データベース上に日付、時間、フラグと言う項目があります。 同一の日付、時間のものは数件ずつあります。 フラグは"b"と"1"があります。 このデータの日付・時間辺りの件数と+フラグが"1"の件数を同時に取得するSQL分はかけますでしょうか? 別々ならば、 SELECT DATE,TIME,COUNT(*) AS KENSU1 FROM W_TABLE GROUP BY DATE,TIME ORDER BY DATE,TIME と SELECT DATE,TIME,COUNT(*) AS KENSU2 FROM W_TABLE WHERE FLG="1" GROUP BY DATE,TIME ORDER BY DATE,TIME でかけると思うのですが、 1個のSQL分で記述は可能でしょうか? 処理結果を 05/02/23 12:00 10 5 05/02/24 10:00 12 3 (日付・時間・件数・フラグ="1"の件数  見たいに取得したいのですが..

  • sql文のヵウント関数について

    sql文のcountを使い、humanテーブルのレコード件数を取得し出力したいのですが、 Object of class SQLite3Result could not be converted to string in のエラーが出て困っています。 (1)humanテーブルのレコード件数を表示する方法を教えてください。(sql文はうまく動いているのが確認できているので、表示する方法を教えていただきたいです。データベースの接続も正常です。) (2)sqlの出力って配列のみなのでしょうか? <?php // 変数の初期化 $db = null; $query=null; $con =null; $db = new SQLite3("test.db"); $res = $db->query ($sql); // データの取得 $query = "SELECT count (id) from human"; //クエリを実行 $con = $db->query($query); //データの件数を表示する print $con; ?>

    • ベストアンサー
    • PHP
  • SQL文 複数条件の場合の書き方

    初めて質問します。 下記のようなデータが存在します。 テーブルA NO DATE GYO 1 2010/12/01 1 1 2010/12/01 2 2 2010/12/01 1 2 2010/12/01 2 2 2010/12/01 3 3 2010/12/02 1 <= 4 2010/12/03 1 4 2010/12/03 2 上記データにて、<=の行の値を取得し変数へ代入したとします。 変数.NO =3 変数.日付 =2010/12/02 変数.GYO =1 上記、変数を元に1件前のレコードを抽出したいのですが SQL文でのいい方法がわかりません。 取得したいレコード 1 2010/12/01 1 1 2010/12/01 2 2 2010/12/01 1 2 2010/12/01 2 2 2010/12/01 3 どうかお願いいたします。

  • アクセスのクエリについて

    1.以下の二つのテーブルを作成しました。 ・テーブル1  case_no:数値型  ap_no:テキスト型  ap_date:日付型  kanriID:数値型 ・テーブル2  kanriID:数値型  F_name:テキスト型 2.上記した二つのテーブルの「KanriID」をリレーションシップして、 さらに、下記の項目をピックアップした選択クエリを作成しました。  case_no ap_no ap_date kanriID(テーブル1)  F_name 3.上記のクエリを基に、ウィザードを利用して単票フォームを作成したのですが、データの更新ができないフォームが出来上がってしまいました。  どうしたら、データの更新ができるようになるのでしょうか?

  • mysqlでのsql文

    石井と申します。 下記のデータの状態をもとに お答えをお願いします。 まず、tb_userというテーブルが id | name | age | hobby | tokugi | insert_dt -------------------------------------------- 1 | 北野 | 31 | 0101 | 0202 | 2005/6/12 という状態で、 tb_categoryというテーブルが以下のような状態になっています。 category_no | category_cd | subcategory_cd | name -------------------------------------------- 0100 | 01 | 00 | 趣味 0101 | 01 | 01 | 映画鑑賞 0102 | 01 | 02 | スキー 0200 | 02 | 00 | 特技 0201 | 02 | 01 | 早食い 0202 | 02 | 02 | 早起き ※subcategory_cdが00のとき、大項目という扱いで subcategory_cdが00以外のとき、 category_cdが同じ範囲で、 大項目に属する小項目という扱いにしています。 このとき、 『北野、映画鑑賞、早起き』というデータを1行で取得したいのですが、 select a.name, b.name from tb_user a, tb_category b where a.hobby=b.category_no or a.tokugi=b.category_no; というsqlで良いでしょうか? 手元にSQLを実行できる環境がないもので、確認させてください。

  • SQLのクエリーで・・・

    SQL2000を使用しています。(Transact-SQL?) 項目1・項目2・項目3には、それぞれ6桁固定の数字が入っているとします。 この3項目から重複無しの件数をカウントしたいのですが (Group byをして更に全体の件数を取得したい) select count(distinct 項目1+項目2+項目3) from テーブル名 という書き方でも問題ないでしょうか? 他にもっとスマートな方法があれば教えて頂けませんか?

  • データの件数を集計するための SQL

    データの件数を集計するための SQL について教えてください。 例えば以下のようなテーブルがあります。 ▼テーブル 名前 |交通手段|日付 -----+--------+---- Aさん|バス |5/1 Aさん|バス |5/2 Aさん|バス |5/3 Bさん|バス |5/1 Bさん|電車 |5/2 ※「日付」については、本質問に直接の関係はありません。 このテーブルにクエリを発行して、以下の結果を取得したいと考えています。 ▼取得したい結果 名前 |交通手段|回数 -----+--------+---- Aさん|バス |3 Bさん|バス |1 Bさん|電車 |1 当方がイメージしている流れは以下の通りです。 SQL は苦手でして、これをひとつにまとめることができません。 1) GROUP BY で束ねる SELECT 名前, 交通手段 FROM テーブル GROUP BY 名前, 交通手段 2) 1)の結果の1件目をSELECTする SELECT COUNT(*) FROM テーブル WHERE 名前='Aさん' AND 交通手段='バス' 3) 1)の結果の2件目をSELECTする SELECT COUNT(*) FROM テーブル WHERE 名前='Bさん' AND 交通手段='バス' 4) 1)の結果の3件目をSELECTする SELECT COUNT(*) FROM テーブル WHERE 名前='Bさん' AND 交通手段='電車' なおレンタルサーバ上 (MySQL 5.0.77) で稼働させるため、 なるべく高速な SQL を希望いたします。

    • ベストアンサー
    • MySQL
  • ACCESS での SELECT の 方法

    ACCESS の初心者です。 同姓同名の社員のデータの重複チェックをしたいと思って以下のようなSELECT分を作りました。 <元データ> 社員CD 社員名   カウント 1   ああああ 2   ああああ 3   いいいい <クエリで「カウント」列に入れるSELECT文> (select count(*) from 社員マスター Where 社員名 = 社員名 ) これを実行すると <クエリ実行後データ> 社員CD 社員名   カウント 1   ああああ   3 2   ああああ   3 3   いいいい   3 となってしまいます そこで「社員マスタ」テーブルをコピーし(項目名はすべて「2」を付加する) (select count(*) from 社員マスター2 Where 社員名 = 社員名2 ) としたら、期待していたとおり <修正クエリ実行後データ> 社員CD 社員名   カウント 1   ああああ   2 2   ああああ   2 3   いいいい   1 となりました。 実際の社員は1万名もいて同姓同名もかなりあり、できればテーブルのコピーを作成せずに、同一テーブル内で上記のことをしたいのですが、そうはいかないものでしょうか?