• ベストアンサー

SQLでのcount方法

こんばんは。まず始めに申し上げておきますと この質問は、できるかどうかすらもわかりません。 できなければ「できない」とお答えいただけるだけでも助かります。 では本題です。 SQLのDBで data1|data2 ----+------- 1   | 1 1   | 2 2   | 2 2   | 4 というようにデータが存在したとします。 ここで、data1=data2の場合、同じデータとしてカウントは「1」とされ、data1!=data2の場合にはそれぞれにカウントします。 つまり、ここで望む結果は以下のようになります。 data |count ----+------- 1   | 2 2   | 3 4   | 1 どうでしょうか? こんなことできるのでしょうか? もし何らかの方法が存在するならばお教えください。 宜しくお願いします。

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

  • ベストアンサー
  • stork
  • ベストアンサー率34% (97/285)
回答No.5

再びstorkです。 >使用しているのはpostgreSQLです.. 前回のSQLは試して見ましたか? postgres使用したことがないんですが、おそらく大丈夫だと思います。 ひっかかるとすればunion句をネストしているところかな(?) 試してみてひっかかったところを補足してもらえば、解決できるかも知れません。 >postgresでvalueは使えないですよね? valueは単なる別名なので関係ないです。 もし、予約語でひっかかる場合は適当な文字に置き換えてください。

takuchin
質問者

お礼

まだまだ理解できない個所はありますが何とか以下の方法でできました。 select data1 as value, count(*) from (select data1 from test where data1=data2 union all select data1 from test where data1!=data2 union all select data2 from test where data1!=data2) as tmp group by value; storkさんのを見本にして少し手を加えたらできました。 「DataCount」というものが結局わからなかったのですが、とりあえず置いときます。(まだまだ勉強が足りん...) ではありがとうございました。皆さん、本当に感謝してます!

その他の回答 (4)

  • stork
  • ベストアンサー率34% (97/285)
回答No.4

下の感じでいかがでしょうか SQLのDBってMS-SQLserverと言うことですか? データを3つのセクションに分けて抽出してカウントします。 1.data1=data2のデータ 2.data1<>data2のdata1 3.data1<>data2のdata2 <SQLserverの例>---------------------------------- SELECT value data, COUNT(value) DataCount FROM (SELECT data1 value FROM table1 WHERE data1 = data2     UNION ALL     SELECT data1 FROM table1 WHERE data1 <> data2     UNION ALL     SELECT data2 FROM table1 WHERE data1 <> data2) AS tableA GROUP BY tableA.value ------------------------------------------------ 後学のために、差し支えない範囲でどのようなことで使用されるのか教えていただけませんか?

takuchin
質問者

補足

使用しているのはpostgreSQLです...。 postgresでvalueは使えないですよね?ちょっと良くわかりませんが、、、。valuesは使うんですけど。 >後学のために、差し支えない範囲でどのようなことで使用されるのか教えていただけませんか? これはちょっと控えさせていただけないでしょうか? すみません。。。m(_ _)m どんなシステムかだけ申しますと、ある商品の出荷入荷情報を統計に取るシステムです。 これだけでどうかご勘弁を。。。 もしpostgreSQLでの方法もご存知でしたらお手数ですがお教えいただけないでしょうか? 宜しくお願いいたします。

  • Watapo3
  • ベストアンサー率76% (33/43)
回答No.3

シングルクォーテーションを忘れた・・・(^ ^; SELECT data, Count(data) 'count' FROM (SELECT data1 'data' from hoge union all select data2 from hoge where hoge.data1 <> hoge.data2) GROUP BY data すいませんでした。m(_ _)m

takuchin
質問者

補足

すみません、できませんでした。いろいろ調べたり、試してみたりしたんですが、、、。 試してみたといっても書かれている内容を把握できませんので正直「下手な鉄砲」です。 もしよろしければ説明を加えていただけると非常にありがたいのですが、、、。 わがまま言って申し訳ありません。

  • Watapo3
  • ベストアンサー率76% (33/43)
回答No.2

動作確認はしていない為、別名の指定にてエラーが起きるかもしれませんが、 SELECT data, Count(data) count FROM (SELECT data1 data from hoge union all select data2 from hoge where hoge.data1 <> hoge.data2) GROUP BY data で、如何でしょうか? 尚、テーブル名は「hoge」とさせて頂きました。

  • hana432
  • ベストアンサー率37% (6/16)
回答No.1

「望む結果」のdataとcountがどう対応しているのかよくわかりません。 例えば、「望む結果」の1行目のdata 1 とcount 2 は何を指していますか? count 2 は、多分、一致するレコードがテーブル例の1行目と3行目の2件あるという意味なのだと思うのですが。。。 補足説明をお願いします。

takuchin
質問者

補足

せ、説明が難しい...。 え~、ではデータが数値だとわかりにくいので、ちょっとテーブル例を文字に変えて1行目から説明します。 data1|data2 ----+------- A   | A A   | B B   | B B   | C まずはdata1=A,data2=A、これは両方AなのでAが1件(count)となります。 次にdata1=A,data2=Bなので先程のAが++され2になり、 Bが1件countされます。 3行目は両方Bなので先程のBに1件++され、2件になります。 最後にdata1=B,data2=CなのでBは3件になって、Cが1件となり、以下の結果になります。 data |count ----+------- A   | 2 B   | 3 C   | 1 おわかりいただけたでしょうか?何かいい策をお待ちしております。

関連するQ&A

  • select count の同一sqlで割り算

    Oracleのsql*plusで 以下のsqlを実行しています。 select count(*) from tableA ; 上記のの結果としてカウント結果が返却されているのですが、今回はその結果を割り算したいのです。イメージとしては以下のとおりです。 [select結果÷n] さらにいうと上記のような計算を同一sql内で計算できることは可能でしょうか。 また、sql内での計算が難しいようでしたら他方法をご教授していただけませんでしょうか。 勉強不足で、すみません。 ご協力、よろしくお願いします。

  • SQLのCOUNT(*)について

    SQLのCOUNTでよくCOUNT(*)というのを見かけるのですが、 COUNT(ID)などとした場合と比べて、理論上どちらが早い のでしょうか?

  • SQLのcount()とgroup by

    以下のようなテーブルがあったとき、 tbl1 id | score 1 | 100 1 | 200 1 | 300 2 | 200 2 | 100 3 | 300 3 | 400 3 | 500 3 | 600 idでまとめて個数を出すとすると、 SELECT count(*) FROM tbl1 group by id とすれば count(*) 3 2 4 と結果が返ってきますが、この結果にidを足して id | count(*) 1 | 3 2 | 2 3 | 4 というようなSQLはどうやって書けばいいのでしょうか? MySQLでは、 SELECT id, count(*) FROM tbl1 group by id と書けるのですが、これは標準的なSQLではNGなそうなので、気になって質問しました。 よろしくお願いします。

  • 動的SQLのCOUNTのとり方

    動的SQLで、DBの件数を取得したいのですが、 うまく取得できず困っています。 教えてください! 以下の様に、記述しているのですが取り方間違っていますか? EXEC SQL EXECUTE statment INTO :CNTNUM; PREPEAした、statmentには SELECT COUNT(*) FROM テーブル名 where kbn = 3; と、ごくごく普通のSELECT COUNT文です。 cnt_numは、int型のホスト変数で宣言しています。 デバックしながら実行すると、cnt_numの値は初期化した時の 0のままです。実際取得した件数が0件なのかもと思い 初期化時に3を代入して実行したら、やはり値は3でした。 なので、件数が取得出来ていないようです。 オラクルエラーにもならず、次の処理へ流れていってしまいます。 知っている方、教えてください。

  • countで0を返せますか?

    PHP,Mysql5です。 IFNULL関数で実現できそうなことがわかり以下のようなソースで 試してみたのですが0ではなくnullが返ってきてしまいます・・・ $where_sql = join(' || ' , $where); //$where_sqlの中身 DATE_FORMAT(create_date, '%Y-%m-%d') = '2009-03-01' || DATE_FORMAT(create_date, '%Y-%m-%d') = '2009-03-02' || 中略・・・ DATE_FORMAT(create_date, '%Y-%m-%d') = '2009-03-30' || DATE_FORMAT(create_date, '%Y-%m-%d') = '2009-03-31' $sql = "SELECT create_date, IFNULL(Count(order_id), 0) as cnt FROM products_order_detail WHERE {$where_sql} GROUP BY order_id"; 例えば以下のような構成だとします。 2009-03-05のデータが1件存在 2009-03-12のデータが2件存在 2009-03-24のデータが1件存在 現状の結果は以下の通りです。 Array ( [0] => Array ( [create_date] => 2009-03-05 [cnt] => 1 ) [1] => Array ( [create_date] => 2009-03-12 [cnt] => 2 ) [2] => Array ( [create_date] => 2009-03-24 [cnt] => 2 ) 当然の結果なのですがこのように存在する分のデータのみが返って きます。希望としての結果の配列は以下のような感じで Array ( [0] => Array ( [create_date] => 2009-03-01 [cnt] => 0 ) 中略・・・ [4] => Array ( [create_date] => 2009-03-05 [cnt] => 1 ) 中略・・・ [11] => Array ( [create_date] => 2009-03-12 [cnt] => 2 ) 中略・・・ [23] => Array ( [create_date] => 2009-03-24 [cnt] => 2 ) 中略・・・ [30] => Array ( [create_date] => 2009-03-31 [cnt] => 0 ) のように比較する日付のデータがあればカウントしなければcntに nullではなく0を入れたいのですがどうすればいいでしょうか? もしくはPHPにて処理するべき事なのか方法が思いつきません。

    • 締切済み
    • PHP
  • COUNTを使うのでしょうか

    SQLについて質問があります。 以下の様なテーブルが2つあります。 -Table1- |id|type| |1 |男 | |2 |女 | |3 |猿 | -Table2- |id|name|type_id| |1 |太郎|1   | |2 |紀子|2 | |3 |幸子|2 | 上記のテーブルから以下の結果が欲しいのですが SQLではどのように書けば良いでしょうか。 |type|COUNT| |男 |1 | |女 |2 | |猿 |0 | 以下の結果は取得できたのですが 猿の結果も欲しいです。 |type|COUNT| |男 |1 | |女 |2 | 基本的な質問で大変申し訳ありませんが教えて頂けますでしょうか。 宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • count(*)のcountをとりたい

    現在、以下のようなテーブルを扱っているのですが、 +---------+ |accountid| +---------+ |   999| |   999| |   638| |   638| |   638| |   999| |   999| |   638| +---------+ を、ユニークな件数でとろうとしています。 現在は > select count(*) from TABLE group by accountid; +----------+ | count(*)| +----------+ |     4| |     4| +----------+ 2 rows in set (0.00 sec) などとして、「2 rows in set」を読むと言う方法なのですが、それだと人の手を介さないといけないのでどうにか出力結果をダイレクトに取得したいのです。 SQLサーバで使えるらしい select count(*) from (select count(*) from TABLE group by accountid) as AA; と言うSQL文を使っても無理だったので、どなたか方法をご存じないでしょうか???

    • ベストアンサー
    • MySQL
  • sumやcount関数について

    いつもお世話になっております。 以下のようなファンクションの中でカウント数を戻り値として返したかったのですが、当然「0」の場合は「0」で返したいのですが、当初以下の場合には「ORA-01403: データが見つかりません。」エラーが発生し上手くいきませんでした。 省略 begin select count(colA) into aaa ~~ group by colB; ret = nvl(aaa,0) return ret; end; 調査のためselect文だけを切り取りSQLPlusにて実行したところ、「レコードが選択されませんでした」となっておりました。 今度は試しに、「select count(count(colA)) into aaa ~~ group by colB;」としたところ、「0」で返ってきましたし、1以上の場合も正しい数値で返ってきました。 同じようにselect文だけを切り取りSQLPlusにて実行したところ、以下のような結果となりました。 count(count(colA)) --------------------- これは、nullという意味になるのでしょうか?? 「レコードが選択されませんでした」との違いはなんなのでしょうか?また、通常PL/SQLにてカウント数=0を返したいときはどのようにするものなのでしょうか?ご教授いただければと思います。 宜しくお願い致します。

  • SQLのSelect Countについて

    たびたびお世話になります。 以下のSQLを実行したらエラーになりましたが原因がわかりません。 select count(A), A from TableA where A > 0 and B is not null; 同時に該当するデータ件数とその項目を取得したかったのですが、なぜ上記のSQLがエラーになるのかわかりません。 教えてください、お願いします_(._.)_

  • 異なる条件でcountしたい

    使用しているのはMySQL5.5です。 以下のようなデータベース(→元データベース)があり、プロジェクト毎の作業時間と作業日数を出すために select プロジェクト, count(*), sum(時間) order by プロジェクト; としたところ、同一日の作業が二重にカウントされて、正確な作業日数が計算できません。 →誤った集計結果1 また、 select プロジェクト, count(*), sum(時間) order by プロジェクト, 作業; とすると、今度はプロジェクト単位で作業時間が計算できませんでした。 →誤った集計結果2 これを、同一日はカウントせず、作業日数と作業時間を集計するには どのようにすればいいでしょうか。 ・元データベース 日付|プロジェクト|作業|時間 2015-10-01|A|DB作成|2 2015-10-01|A|データ入力|1 2015-10-01|B|DB作成|3 2015-10-02|A|データ入力|1 2015-10-02|B|DB作成|4 2015-10-02|B|データ入力|2 ・誤った集計結果1 プロジェクト|作業日数|時間 A|3|4 B|3|9 ・誤った集計結果2 プロジェクト|作業日数|時間 A|1|2(DB作成のrow) A|2|2(データ入力のrow) B|2|7(DB作成のrow) B|1|2(データ入力のrow) ・理想の集計結果 A|2|4 B|2|9

    • ベストアンサー
    • MySQL