質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
GROUP BY

GROUP BYとはSQL文のひとつで、SELECT文において特定の列の値が等しい行ごとに表をグループ化します。

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Q&A

解決済

4回答

9325閲覧

group byについて教えて下さい

退会済みユーザー

退会済みユーザー

総合スコア0

GROUP BY

GROUP BYとはSQL文のひとつで、SELECT文において特定の列の値が等しい行ごとに表をグループ化します。

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

0グッド

1クリップ

投稿2017/11/19 03:19

select 氏名、電話番号
from テーブル
where 条件

group by 電話番号

電話番号の重複を圧縮したいから、「group by 電話番号」と記述して実行しても、
select に氏名が入っているとエラーになります。
なので「group by 電話番号,氏名」としたら、今度は電話番号が重複してしまいました。

どうすれば、電話番号で圧縮しつつ氏名も表示できるのでしょうか。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

基本的には「できない」というのが正解だと思います。
電話番号が同じものをまとめるということは、氏名は複数の名前がありえるわけですから、表示しようがないでしょう。
一例として、以下のテーブルがあった場合に、GROUP BY 電話番号とした場合、03-1234-5678が電話番号である列の氏名は、山田と佐藤の2つがあります。

氏名電話番号
1山田03-1234-5678
2田中06-9876-5432
3佐藤03-1234-5678

この場合、代表して片方だけの氏名を表示したいのか、両方の氏名をカンマ区切り等で表示したいのか…
その仕様にあわせてSQL文を工夫する必要がありますし、場合によってはSQLだけではできないかもしれません。
つまり、まずは「やりたいことを明確に」ということですね。

投稿2017/11/19 03:47

ockeghem

総合スコア11701

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/11/20 13:41

ありがとうございました!
guest

0

ベストアンサー

電話番号の重複を圧縮したいから、「group by 電話番号」と記述して実行しても、

select に氏名が入っているとエラーになります。

「group by 電話番号,氏名」としたら、今度は電話番号が重複してしまいました。

同じ電話番号で異なる名前は存在していない場合は、max、minを使う事ができます。

sql

1select 電話番号, max(氏名) as 氏名 2from テーブル 3where 条件 4group by 電話番号

ps:mysqlではエラーとはならないです。

ご指摘を受けましての修正です。
氏名&電話番号でgroup byした場合と有りますので氏名が同じでないものが存在していると言う事になります。
上記の場合maxで文字列の最大値、minで文字列の最小値が表示されます。

投稿2017/11/19 09:53

編集2017/11/19 10:19
A.Ichi

総合スコア4070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ockeghem

2017/11/19 10:11

『「group by 電話番号,氏名」としたら、今度は電話番号が重複してしまいました。』とあるので、『同じ電話番号で異なる名前は存在してい』るのではないでしょうか? …アイデアは興味深く拝見しました
A.Ichi

2017/11/19 10:14

あ、その通りです。大変失礼いたしました。修正を加えておきます。
退会済みユーザー

退会済みユーザー

2017/11/20 13:41

ありがとうございました!
guest

0

SQLServerでも、group_concat()※oracle,mysqlarray_agg()※postgresのようなことが可能です。
カラムの値からカンマ区切り (CSV) の文字列を生成する

下記例ではカンマ区切りの最後は除去していませんが、リンク先には除去の例もあります。

SQL

1SELECT 電話番号 2 ,(SELECT 氏名 + ',' FROM テーブル WHERE 電話番号=t1.電話番号 FOR XML PATH('')) AS 氏名 3FROM テーブル as t1 4GROUP BY 電話番号

尚、SQL Server 2017であれば、STRING_AGG()が使用できるようです。
SQL Server 2017 新機能 - STRING_AGG 関数 - CSV 文字列生成が簡単に!

投稿2017/11/19 15:50

編集2017/11/20 00:16
sazi

総合スコア25195

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/11/20 13:41

ありがとうございました!
guest

0

まず、group by した場合には、select できる項目は group by の条件としているものか、もしくは集合関数(sum, avg, min, max, count 等)をかけたもの に限定されます。
なので最初のやり方だと、group by の条件でもないし集合関数にもなっていない、氏名という項目があるからエラーとなるのです。

2個目の方だと今度は 電話番号と氏名が同じ ものを集約するので、その条件で電話番号が重複するということは、電話番号が同じだが氏名が異なるレコードがあるということになります。
ではこれをどう出力させたいのか? というのが分からないと、どうすればよいのかは確たる答えが出せません。
どれかとにかく一つだけでも出せばいいのか、あるいはすべての氏名を連結させたいのか、など、いろいろ欲しい情報は異なってくるはずだからです。

投稿2017/11/20 00:31

tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問