• ベストアンサー

DISTINCTとGROUP BYの違い

DISTINCTとGROUP BYの違いが分かりやすいホームページを教えてください。 ターミナルの結果のサンプルが書かれているホームページが理解しやすいです。

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

  • ベストアンサー
  • tea2005
  • ベストアンサー率50% (3/6)
回答No.1

"DISTINCT"はSQL文を実行した結果のテーブルから、重複している行を単純に削除して、重複のない結果をだすものです。それに対し"GROUP BY"は、結果のテーブルに対してグループ化を行い、さらに集計をすることを可能にします。よって、"GROUP BY"は主に集計関数と共に用いることが多いです。 確かに、単純に重複を取り除く目的だったらどちらでも結果は同じことになりますが、集計を必要とするような場合は"GROUP BY"を使うことが必至です。 ↓の掲示板のレスで、この2つの違いについて例を挙げて説明されています。http://fukkey.dyndns.org/pins/ora/020430/42660.html また、参考URLに挙げたフォーラムの記事でも、この2つの使い分けについて論議されていますので、参考になれば幸いです。 "GROUP BY"を用いて集計する方法の具体例は、以下のページで解説されていますので、参考にして下さい。 http://www.atmarkit.co.jp/fnetwork/rensai/sql03/sql1.html http://www.techscore.com/tech/sql/05_08.html

参考URL:
http://otn.oracle.co.jp/cgi-bin/non/msgview_r.cgi?communityid=otn-489965&bbsid=1&no=38927&view=8
edualr
質問者

お礼

たくさんのアドレスありがとうございます。

関連するQ&A

  • GROUP BY と DISTINCT

    SQLPLUSにおいて、ある表X1(code1,code2)に (A,1),(A,1),(A,2),(A,2),(A,3),(A,3) (B,4),(B,4),(B,5),(B,5),(B,6),(B,6) というデータがあり、別の表X2(data1,data2)に (1,10),(2,20),(3,30),(4,40),(5,50),(6,60) というデータがある場合に(X2の左の要素はprimary) 結果として(A,60),(B,150)というデータを得たいのですが、GROUP BY や DISTINCT を使おうするとエラーになってしまいうまくいきません。 <select code1,sum(data2) from X1,X2 where distinct(X1.code2) = X2.data1 group by code1> みたいな感じでやりたいのですが、(distinctがこの使い方でできないのはわかってます)どうしたらいいでしょうか? ちなみに副問合せを使って先にX1から(A,1),(A,2)...(B,6)をセレクトしようとしてもダメでした。 説明がわかりづらくて申し訳ございませんがどなたか詳しい方のアドバイスをお願い致します

  • SQL文「DISTINCT」の「ORDER BY」について

    SQL文「DISTINCT」の「ORDER BY」について教えて下さい。 A列をDISTINCTで重複行の排除をしています。 その後、B列でORDER BYをかけたいのですが、エラーが 出てしまいます。A列でのORDER BYは成功します。 何か良い方法があれば教えて下さい。 よろしくお願いします。 SQL="SELECT DISTINCT A列 from table " &_ "WHERE (table.C列='100') " &_ "ORDER BY (table.B列) ASC " ⇒エラー    "ORDER BY (table.A列) ASC " ⇒成功

  • group by句について

    すいません。教えてください。 emp表からJobのデータが何種類あるか出力したいとき、 ・ select count(distinct job) from emp; はいいのに、 ・ select count(job) from emp group by job; がエラーになる理由を知っている方、教えてください。

  • distinct したい!

    select ●, distinct ■ from sample こんな感じで取得できないでしょうか ●は無条件でくっついてくる感じです。。。

    • ベストアンサー
    • MySQL
  • 年月でdistinctしたい(PostgreSQL)

    PostgreSQLでdistinctの使い方についての質問です。 t_mainのDDATEカラム(DATE)に DDATE ============================ 20030929 20030930 20031001 20031002 ・ ・ ・ というデータが入っています。 このデータのうち、年月でdistinctした データが欲しいので、以下のようにSQLを組みました。 =========================================== select distinct substring(DDATE from 1 for 6) from t_main order by DDATE これでは値が取得できなかったので、次に =========================================== select distinct TO_CHAR(DDATE,'YYYYMM') from t_main order by DDATE としましたが、これも値が返ってきません。 上手に年月でdistinctできる方法を教えてください。 欲しいのは ======== 200309 200310 という結果です。 宜しくお願いいたします。

  • group byで最後のレコードを抽出したい

    group byで特定のカラムをまとめる際に、最後(最新)のレコードを抽出したいのですが 最初(古い)の行が抽出されてしまいます。 例えば、threadカラムとuptimeカラムがあるテーブルBBSで threadカラムをgroup byでまとめる際にuptimeの降順(desc)でまとめたい場合 どのようにしたらいいでしょうか? 【テーブルBBS】 id thread uptime 1 1 1230100000 2 2 1230200000 3 1 1230300000 4 3 1230400000 5 1 1230500000 6 2 1230600000 select * form bbs group by thread order by uptime desc だと thread uptime 3 1230400000 1 1230300000 2 1230200000 になってしまいます。 次のような結果を表示するにはどのようにしたらいいでしょうか。 thread uptime 2 1230600000 1 1230500000 3 1230400000 また、DISTINCTを使うと同じフィールド内に重複したレコードがある場合は最初のレコードのみ表示されますが、最後のレコードのみ表示するにはどのようにすればいいのでしょうか? よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • DISTINCTの使い方を教えて下さい

    Select 文で DISTINCT を記述すると結果(Count)は-1となってしまいます。 DISTINCTを外すと全件表示されます。 これは何がまずいのでしょうか ? 環境 DB=SQLserver 2000 + IIS 5.0 + ASP 例:Select DISTINCT TABLE1,TABLE2,TABLE3 FROM TABLE ちなみにdbをAccess で使用している時とクエリアナライザではOKでした。

  • GROUP BYについて

    初歩的な質問になってしまいますが、GROUP BYの使い方について解らない点があるので、宜しくお願いします。 次のようなボーリング大会のレコードがあったとして、 ========bowling TBL (以下、フィールド名)===================== 氏 名|ゲーム回数|1投目|2投目|3投目|・・10投目| ============================================================ 注※ゲーム回数はintで1からインクリメントしていく。 氏名別に1番最後に行ったゲームを参照したい場合 ●SELECT 氏名 MAX(ゲーム回数) GROUP BY 氏名 で、 ----------------------------------------------------- Aさん|3| Bさん|5| ----------------------------------------------------- が得られますが、更にこの最終ゲームでの1投目と2投目の結果のみを付け足し、 ----------------------------------------------------- Aさん|3|12本|19本| Bさん|5|03本|15本| ----------------------------------------------------- のように参照したい場合、どのようなSQL文になるのでしょうか? どなたかご教示宜しくお願いします。

    • ベストアンサー
    • MySQL
  • accessでDISTINCT 句と矛盾

    IIFで置き換えをした結果をソートしようとしましたが、 SELECT DISTINCT a,IIF(IsNull(b), 0, 1) AS c FROM shain ORDER BY a,c [Microsoft][ODBC Microsoft Access Driver] ORDER BY 句 (c) が DISTINCT 句と矛盾しています。 というエラーになりました。 正しいSQLを教えてください。 SELECT DISTINCT a,IIF(IsNull(b), 0, 1) AS c FROM shain ORDER BY a,b も試しましたが同じようにエラーになりました。

  • 無視されるdistinct

    お世話になります  大規模商談をまとめた営業のリストを作るSQLを書こうとしています。   営業部員テーブル (test.person) id | name ----+------ 1 | 山田 2 | 高橋 3 | 田中 商談テーブル (test.deal) id | person_id | customer | amount ----+-----------+----------+-------- 1 | 1 | XX商事 | 20000 2 | 3 | BB電機 | 10000 3 | 2 | ZZ不動産 | 2000 4 | 1 | RR証券 | 8000 期待している検索結果 name | amount | customer ------+--------+---------- 山田 | 20000 | XX商事 田中 | 10000 | BB電機 高橋 | 2000 | ZZ不動産 下記のようなSQLを書きました。 select distinct name,amount,customer from test.deal,test.person where person.id=deal.person_id order by amount desc  しかし、nameをdistinctしているにもかかわらず、結果は下記の通り、「山田」が重複しています。 name | amount | customer ------+--------+---------- 山田 | 20000 | XX商事 田中 | 10000 | BB電機 山田 | 8000 | RR証券 高橋 | 2000 | ZZ不動産 いろいろと調べて、group by を使えばいい、というようなやり方を示している例も多かったのですが、それもうまくいきません。(必要であれば載せます) 期待通りの結果を得るにはどのようなSQLを書けばよろしいでしょうか。 よろしくお願いいたします。