select 氏名、電話番号
from テーブル
where 条件
group by 電話番号
電話番号の重複を圧縮したいから、「group by 電話番号」と記述して実行しても、
select に氏名が入っているとエラーになります。
なので「group by 電話番号,氏名」としたら、今度は電話番号が重複してしまいました。
どうすれば、電話番号で圧縮しつつ氏名も表示できるのでしょうか。
よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答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
総合スコア11705
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総合スコア4070
0
SQLServerでも、group_concat()
※oracle,mysqlやarray_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総合スコア25430
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

退会済みユーザー
2017/11/20 13:41

0
まず、group by した場合には、select できる項目は group by の条件としているものか、もしくは集合関数(sum, avg, min, max, count 等)をかけたもの に限定されます。
なので最初のやり方だと、group by の条件でもないし集合関数にもなっていない、氏名という項目があるからエラーとなるのです。
2個目の方だと今度は 電話番号と氏名が同じ ものを集約するので、その条件で電話番号が重複するということは、電話番号が同じだが氏名が異なるレコードがあるということになります。
ではこれをどう出力させたいのか? というのが分からないと、どうすればよいのかは確たる答えが出せません。
どれかとにかく一つだけでも出せばいいのか、あるいはすべての氏名を連結させたいのか、など、いろいろ欲しい情報は異なってくるはずだからです。
投稿2017/11/20 00:31
総合スコア13707
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/11/20 13:41