Jawaban:
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
GROUP_CONCAT
mungkin 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
.
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
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
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
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.
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;