Cara menggunakan GROUP_CONCAT di CONCAT di MySQL

117

Jika saya memiliki tabel dengan data berikut di MySQL:

id       Name       Value
1          A          4
1          A          5
1          B          8
2          C          9

bagaimana cara memasukkannya ke dalam format berikut?

id         Column
1          A:4,5,B:8
2          C:9


Saya pikir saya harus menggunakan GROUP_CONCAT. Tapi saya tidak yakin bagaimana cara kerjanya.

Biswa
sumber

Jawaban:

160
select id, group_concat(`Name` separator ',') as `ColumnName`
from
(
  select 
    id, 
    concat(`Name`, ':', group_concat(`Value` separator ',')) as `Name`
  from mytbl
  group by 
    id, 
    `Name`
) tbl
group by id;

Anda dapat melihatnya diimplementasikan di sini: Demo Sql Fiddle . Persis yang Anda butuhkan.

Perbarui Pemisahan dalam dua langkah. Pertama kita mendapatkan tabel yang memiliki semua nilai (dipisahkan koma) terhadap [Nama, id] yang unik. Kemudian dari tabel yang diperoleh kita mendapatkan semua nama dan nilai sebagai nilai tunggal terhadap setiap id unik Lihat ini dijelaskan di sini Demo SQL Fiddle (gulir ke bawah karena memiliki dua set hasil)

Sunting Ada kesalahan dalam membaca soal, saya telah mengelompokkan berdasarkan id. Tetapi dua group_contacts diperlukan jika (Nilai akan digabungkan dikelompokkan berdasarkan Nama dan id dan kemudian di atas semua oleh id). Jawaban sebelumnya adalah

select 
id,group_concat(concat(`name`,':',`value`) separator ',')
as Result from mytbl group by id

Anda dapat melihatnya diimplementasikan di sini: SQL Fiddle Demo

Sami
sumber
Ini tidak memberikan apa yang diminta Biswa.
eisberg
3
Saya pikir penting untuk memperingatkan orang-orang bahwa hanya menggunakan satu jenis pemisah dapat merugikan. Saya sarankan untuk membuat pemisah "nama" sebagai titik koma (;), dan pemisah nilai dapat tetap berupa koma (,)
Fandi Susanto
4
Harap perhatikan juga bahwa GROUP_CONCATmungkin secara diam-diam memotong keluarannya menjadi group_concat_max_len. SET group_concat_max_len=...akan membantu, tetapi sebaiknya periksa apakah panjang yang dikembalikan (byte?) kurang dari group_concat_max_len.
tuomassalo
2
Perhatikan juga bahwa group_concat menemukan satu nilai NULL yang akan menghilangkan seluruh baris yang berisi itu. Saya mengatasi ini di peringatan kedua di sini .
MatrixManAtYrService
1
Jika ada yang menghadapi masalah dengan tautan SQL Fiddle yang diberikan sebagai jawaban. Working Fiddle ada di sini: sqlfiddle.com/#!9/42f994/601/0
Hitesh
21

Mencoba:

CREATE TABLE test (
  ID INTEGER,
  NAME VARCHAR (50),
  VALUE INTEGER
);

INSERT INTO test VALUES (1, 'A', 4);
INSERT INTO test VALUES (1, 'A', 5);
INSERT INTO test VALUES (1, 'B', 8);
INSERT INTO test VALUES (2, 'C', 9);

SELECT ID, GROUP_CONCAT(NAME ORDER BY NAME ASC SEPARATOR ',')
FROM (
  SELECT ID, CONCAT(NAME, ':', GROUP_CONCAT(VALUE ORDER BY VALUE ASC SEPARATOR ',')) AS NAME
  FROM test
  GROUP BY ID, NAME
) AS A
GROUP BY ID;

SQL Fiddle: http://sqlfiddle.com/#!2/b5abe/9/0

eisberg
sumber
2
Ya eisberg +1. Jawaban Anda cukup akurat dan lebih awal. Saya membuat kesalahan dalam jawaban pertama saya
Sami
9
SELECT ID, GROUP_CONCAT(CONCAT_WS(':', NAME, VALUE) SEPARATOR ',') AS Result 
FROM test GROUP BY ID
John
sumber
7
Alangkah baiknya jika Anda dapat menambahkan beberapa deskripsi pada jawaban Anda. Ini adalah saran untuk memperbaiki jawaban ini dan yang akan datang. Terima kasih!
Luís Cruz
5

Pertama-tama, saya tidak melihat alasan memiliki ID yang tidak unik, tapi saya rasa ID itu terhubung ke tabel lain. Kedua, tidak perlu subkueri, yang mengalahkan server. Anda melakukan ini dalam satu kueri, seperti ini

SELECT id,GROUP_CONCAT(name, ':', value SEPARATOR "|") FROM sample GROUP BY id

Anda mendapatkan hasil yang cepat dan tepat, dan Anda dapat membagi hasilnya dengan SEPARATOR "|" itu. Saya selalu menggunakan pemisah ini, karena tidak mungkin menemukannya di dalam string, oleh karena itu unik. Tidak ada masalah memiliki dua A, Anda hanya mengidentifikasi nilainya. Atau Anda dapat memiliki satu kolom lagi, dengan hurufnya, yang bahkan lebih baik. Seperti ini :

SELECT id,GROUP_CONCAT(DISTINCT(name)), GROUP_CONCAT(value SEPARATOR "|") FROM sample GROUP BY name
Lucian Minea
sumber
2
 SELECT id, GROUP_CONCAT(CONCAT_WS(':', Name, CAST(Value AS CHAR(7))) SEPARATOR ',') AS result 
    FROM test GROUP BY id

Anda harus menggunakan cast atau convert, jika tidak maka BLOB akan dikembalikan

hasilnya adalah

id         Column
1          A:4,A:5,B:8
2          C:9

Anda harus menangani hasil sekali lagi dengan program seperti python atau java

lglcomcn.dll
sumber
0

IF OBJECT_ID('master..test') is not null Drop table test

CREATE TABLE test (ID INTEGER, NAME VARCHAR (50), VALUE INTEGER );
INSERT INTO test VALUES (1, 'A', 4);
INSERT INTO test VALUES (1, 'A', 5);
INSERT INTO test VALUES (1, 'B', 8);
INSERT INTO test VALUES (2, 'C', 9);

select distinct NAME , LIST = Replace(Replace(Stuff((select ',', +Value from test where name = _a.name for xml path('')), 1,1,''),'<Value>', ''),'</Value>','') from test _a order by 1 desc

Nama tabel saya adalah test, dan untuk penggabungan saya menggunakan sintaks For XML Path (''). Fungsi barang memasukkan string ke string lain. Ini menghapus panjang karakter tertentu dalam string pertama di posisi awal dan kemudian memasukkan string kedua ke string pertama di posisi awal.

Fungsi STUFF terlihat seperti ini: STUFF (ekspresi_karakter, mulai, panjang, ekspresi_karakter)

character_expression Merupakan ekspresi dari data karakter. character_expression dapat berupa konstanta, variabel, atau kolom dari data karakter atau biner.

start Adalah nilai integer yang menentukan lokasi untuk memulai penghapusan dan penyisipan. Jika awal atau panjang negatif, string nol dikembalikan. Jika awal lebih panjang dari ekspresi_karakter pertama, string null dikembalikan. mulai bisa tipe bigint.

length Adalah bilangan bulat yang menentukan jumlah karakter yang akan dihapus. Jika panjangnya lebih panjang dari ekspresi_karakter pertama, penghapusan terjadi hingga karakter terakhir dalam ekspresi_karakter terakhir. panjangnya bisa tipe bigint.

Novy
sumber
0

PILIH id, Group_concat ( column) FROM (SELECT id, Concat ( name, ':', Group_concat ( value)) SEBAGAI column DARI mytbl GROUP BY id, name) tbl GROUP BY id;

Mrigank Shekhar
sumber