MySQLで条件指定と重複チェック後のカウント方法

このQ&Aのポイント
  • MySQLで条件指定と重複チェック後のカウント方法についてわからないと悩んでいます。
  • Aのプロセス数をID単位で表示したいが、重複プロセスは1とカウントしたいです。
  • 条件指定と重複チェック後のカウントができる方法を教えてください。
回答を見る
  • ベストアンサー

条件指定と重複チェック後のカウント

MySQLを最近触り始めたばっかりで 頭を抱えています どなたか知恵を貸してくれませんでしょうか; ID |code|process 100|A |a001 100|A |a001 100|A |a002 100|B |a003 200|C |a004 *ID単位のAに対するprocess数を表示したい *重複processは1とカウント ID |process数 100|2 200|0 最終的に上記のように表示させたいのですが 方法が分かりません。。。 whereで A を条件指定にすると code Aを持たないID 200が表示されなくなるので whereを使用することもできず・・・ 条件指定と重複チェック後のカウントが出来る方法はありませんでしょうか?

  • MySQL
  • 回答数3
  • ありがとう数5

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

  • ベストアンサー
回答No.3

#2回答者です。 >このSQLをちょこっと変更すれば >すぐ出来るのかなぁと思ってたのですが やりたいと言っていることとやっていることが、違っていますよ? テストデータによって、一見、近い結果が得られているように見えているだけで、やっていることはデタラメなんですけど? #2で示したSQLは、分解すればMySQL 4.1でもすぐに応用が利くし、多くのヒントが含まれていたはずなのに、見向きもされなかったようでまったく不本意です。 MySQL 4.1で使えないのは、インラインビューだけなので、これを一時表にすれば使えます。 【表定義&データ】 create table t1 (id int, code char(1), process char(4)); insert into t1 values (100,'A','a001'), (100,'A','a001'), (100,'A','a002'), (100,'B','a003'), (200,'C','a004'); 【一時表作成&検索】 -- 04-01 drop temporary table if exists wt1; create temporary table wt1 select * from t1 where code='A'; select x.id,count(distinct y.process) as process数 from t1 as x left join wt1 as y on x.id=y.id group by x.id ;

pinky_mint
質問者

お礼

ありがとうございます。 無事に表示することができました。 #2で教えて頂いたSQLは どこをどうすればいいのかさっぱり分からなかったので 流してしまいました。 大変申し訳ございませんでした。

その他の回答 (2)

回答No.2

MySQLの質問をする場合は、バージョンを明記してください。 せっかく具体的なSQL例を提示しても、あなたの環境では使えない場合があり得ます。 【SQL例】MySQL 5.0以降 select x.id,count(distinct y.process) from t1 as x left join (select * from t1 where code='A') as y on x.id=y.id group by x.id ; 【備考】 条件式やORDER BY、GROUP BYなどで演算を行うと、インデクスが定義されていても有効利用されないため、性能を重視する場合は注意してください。

pinky_mint
質問者

お礼

ご指摘ありがとうございます。 調べてみましたら mysql Ver 14.7 Distrib 4.1.18, for Win32 (ia32) と表示されました。

  • nikuq
  • ベストアンサー率22% (8/36)
回答No.1

こんな感じでしょうか? select ID,count(concat(ID,code,process)) as process_num from TABLE_NAME group by concat(ID,code,process) テストしてないので、できてるかわかりませんが、 ID,code,processで一つの単語として認識させ、それをグループ化し、グループ内のレコード数をカウントしています。 これだと、表示結果は恐らく、 ID|code|process 100|2 100|1 200|1 となると思います。 最初の100|1は、100|A|a001の合計数で、 2行目の100|1は、100|B|1002の合計数で、 3行目の20|1は、200|C|a004の合計数 になります。 200|C|a004を0としてカウントする方法は、あるのかなぁ? ちょっと分かりません。 すみません。中途半端で。。。

pinky_mint
質問者

お礼

回答ありがとうございます。 教えて頂いたconcatを使って試してみましたが Aを条件として絞り込む事が上手くできませんでした。。。 今、悩んでいるprocess数をカウントする前に IDごとのcode数を数える文を作成したSQLは select ID, sum(case when code = 'A' then 1 else 0 end) as code_count from table_A group by ID; 結果 ID|code_count 100|3 200|0 と表示することが出来ました。 このSQLをちょこっと変更すれば すぐ出来るのかなぁと思ってたのですが どうにも上手くいかないです;

関連するQ&A

  • 不要なwhere文が混じった重複レコードのカウント

    下記のSQL文があります。 tableA内で、tableA.id(A.id)は重複があります。 tableA内でのtableA.id(A.id)の重複レコード数をcount関数などでSELECTしたいのですが、 下記SQL文からどのように付け加えたらいいのか、お分かりの方いますでしょうか? SELECT A.id as id, A.xxx as xx, A.yyy as yy, B.zzz as zz FROM tableA A, tableB B WHERE A.id = B.id AND A.xxx = x AND A.yyy = y なお、「A.yyy = y」という条件は、tableA.idの重複レコード数をカウントする上で必要な条件なのですが、 「A.xxx = x」という条件は、tableA.idの重複レコード数をカウントする上で、不要な条件です。 以上、よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • 重複を除くカウントの取得方法

    御晩です。 ----------------- <?php //カウント $id= "$k_id"; $id = mb_convert_encoding($k_id,"EUC-JP","SJIS"); $id_count = $DB->getone("SELECT count(*) FROM ".$k_koukoku_log_table." ".$k_koukoku_inp_table." where a_num =$k_id"); ?> カウント数は<?=$id_count?>です。 ----------------- 上記は重複もカウントされてしまいます。 ユーザー個々に広告番号があり($k_id)、その広告番号をクリックされた回数を同一人物(重複)を除いてのカウントを表示したいと思っています。

    • ベストアンサー
    • MySQL
  • クライアント毎に重複をカウントしたい

    MYSQLを勉強中です。 下記のようなテーブルがあります。 【クライアトテーブル】: クライアントID 1 | A社 2 | B社 3 | C社 4 | D社 【お問合せテーブル】: お問合せmail |お問合せ先のクライアントID|お問合せ日時 aaa@aaa.com |1 |2013-02-01-10:00:00 aaa@aaa.com |2 |2013-03-01-10:00:00 bbb@bbb.com |3 |2013-04-01-10:00:00 ccc@ccc.com |4 |2013-04-02-10:00:00 aaa@aaa.com |1 |2013-04-03-10:00:00 ここで、 クライアント毎に、4月分の問合せ数を表示したいのですが、 4月1日~4月末日に問合せのあったメールアドレスと、 2月1日~3月末日に問合せのあったメールアドレスを比較して、 下記のように重複分をクライアント毎にカウントしたいです。 問合せ数: A社:1件 重複1件 C社:1件 重複1件 D社:1件 重複0件 クライアントIDを個別で指定すれば正しく表示できるのですが、 クライアント一覧を取得するのはどのようなSQLを書けばよいのでしょうか。。。 もう1ヶ月悩んでおります。 すみませんが、教えて頂けますと幸いです。

    • ベストアンサー
    • MySQL
  • 重複した項目のカウント(条件がもう一つあります)

    A   あ B   あ A   い B   う C   あ B   い B   あ C   あ A   い ↑のようなセルがあったとします。 これを、左側の項目ごとに、重複を無視して右側の項目の数を数えたいです。 例えば、 Aについては"あ"と"い"の2つだから2、 Bについては"あ"と"い"と"う"で3、 Cについては"あ"だけなので1 という具合です。 補助列を使ったりマクロで数えたりすればできるのですが、 関数のみを使ったやり方はないでしょうか。 ※ある範囲内で重複を無視してカウントするだけなら  =SUMPRODUCT(1/SUBSTITUTE(COUNTIF(範囲,範囲),0,0))  でできました。    これを使って、Aについて、Bについて、Cについての条件も  加えようとしましたが、  やり方がわかりません。

  • phpでMySQL内の重複文字カウント

    phpでMySQL内に格納されている文字データのうち、重複した文字データを 重複数順にランキング表示するプログラムを作成しようと思います。 例 MySQLデータが 昼 夜 昼 昼 夜 朝 であれば、 1、昼 2、夜 3、朝 とphpで表示 MySQLへのデータ登録は、普通にmysql_queryでSQL文を飛ばしてデータ挿入しています。 その際、MySQL内のデータと重複したらイベント(重複カウントを1増やすなど)を起こす方法、 もしくは、重複しているデータと、その重複数を取得できるようなphp関数、SQL文はないものでしょうか? データ数自体は100程度のものなので、全データをphpで配列に格納してから、 配列内を捜査でもよいのですが・・・ 初歩的かつ限定的な質問ですが、どうかご回答お願いします。

    • ベストアンサー
    • PHP
  • エクセルの指定部分数を超える重複チェックについて

    エクセルの指定部分数を超える重複チェックについて 例えばA列に以下の文章があったとします。 1.吾輩は猫である。名前はまだない。 2.吾輩は猫である。名前はもうある。 3.吾輩は犬である。名前はまだない。 4.吾輩は犬でない。名前はもうある。 5.本当に吾輩は猫である。名前はまだないかもしれない。 この中から、10文字以上【連続して】重複している箇所を探したい場合どうすれば良いでしょうか? 1~4で上記の条件に当てはまるのは 1と2の「吾輩は猫である。名前は」と、1と3の「である。名前はまだない。」と、1と5の「吾輩は猫である。名前はまだない」です。 2と4の「。名前はもうある。」も重複していますが、指定の文字数に達していないのでスルーさせたいです。 重複が見つかった場合の表示方法についてですが、重複している箇所がわかればどういう形で表示されても構いません。 ただ「重複の削除」のように、何が重複していたのかわからないまま削除されてしまうのは困ります。

  • エクセルの複数のフィールドの重複のチェック方法を教えて!

    エクセルの複数のフィールドの重複のチェック方法を教えて! 下のようなテーブルで3人の顧客IDより月別のピボットテーブルをエクセルで作成すると IDを重複してカウントしてしまいます。Aランク顧客IDは2010/1に3のカウントなのですが、顧客数は1としたい場合、CustomerIDと購買月が重複せずにカウントさせる方法や関数を教えてください。 CustomerID ランク 購買月   1017        A    2010/1 1017        A    2010/1 1017        A    2010/1 1017        A    2010/2 1017        A 2010/3 226424    A 2010/2 226424 A 2010/ 2226424 A 2010/2 226424 A 2010/3 226424 A 2010/3 823622 B 2010/2 823622 B 2010/2 823622 B 2010/3 823622 B 2010/3 1205 B 2010/2

  • エクセル 重複しないで 条件付きカウント

    下記の様なデータがエクセルシートに入力されていて、 品番事(重複させずに)に全て入荷したら 入荷終了にカウントしたいのですが、どのような条件でカウントしたら良いのでしょうか? 下記の場合、入荷終了を”1”と表示したいです。 (同品番は、重複しないで1品番として、且つ入荷日全てに日付が入力されている物だけをカウント。また、品番は不特定多数(1,500品以上)となります。) 宜しくお願い致します。 品番  入荷日   入荷終了 11  6/1    1 11 11 22  6/3 22  6/5 33 33  5/3 ・ ・ ・ ・

  • LibreOffice関数 重複するものをカウント

    LibreOfficeにて複数の一致条件の中、重複するものは1つとしてカウントするやり方を教えてください。 IDと名前の入力をしており、共に一致したものをカウントするというものになります。 【例】 ID   名前 001 山田太郎 002 山田太郎 001 山田太郎 この場合、「ID:001」は「1」、「ID:002」は「1」とカウントされるようにしたいです。 宜しくお願いします。

  • 外部結合と抽出条件の指定について

    皆様、ご教授願います。 初めてoracleを利用しているので、ほんとの初心者で 記述の方法がわかりません。 下記の記述でカウントの結果が異なります。 私の中では、同じ結果が得られると思うのですが どのような違いがあるのでしょうか??? -------------------パターン1------------------- SELECT  count(A.SO_CODE) FROM  URI_HEAD A,  KOKUB_FILE B WHERE  A.SO_CODE=B.SO_CODE(+) -------------------パターン2------------------- SELECT  count(A.SO_CODE) FROM  URI_HEAD A,  KOKUB_FILE B WHERE  A.SO_CODE=B.SO_CODE(+) AND  A.KYOTEN_CODE like '%' AND  B.TAN_CODE like '%' ORDER BY  A.SO_CODE asc 最終的には、パターン2のそれぞれの項目に 条件が入るのですが、テスト段階でまずは、あいまい検索に してみたのですが。。。 この記述に誤りがあるのでしょうか??? MSSQLやpostgresは使ったことがあるのですが oracleは初めてなので、SQL文の記述に誤りがあるのか、oracleを利用したときの記述に誤りがあるのか 判断がつかなくて、先に進めません。 教えてください。。。