Rumah > pangkalan data > tutorial mysql > Bagaimana untuk menukar baris kepada lajur dalam mysql

Bagaimana untuk menukar baris kepada lajur dalam mysql

WBOY
Lepaskan: 2022-03-28 15:44:27
asal
13212 orang telah melayarinya

Kaedah baris ke lajur MySQL: 1. Gunakan penukaran operasi "SUM(nama jadual KES APABILA nama medan KEMUDIAN skor ELSE 0 TAMAT) sebagai nama medan" 2. Gunakan "SUM(JIKA(nama jadual = medan nama,skor,0)) sebagai nama medan" penukaran operasi.

Bagaimana untuk menukar baris kepada lajur dalam mysql

Persekitaran pengendalian tutorial ini: sistem Windows 10, versi mysql8.0.22, komputer Dell G3.

Cara menukar baris kepada lajur dalam mysql

Baris ke lajur

Iaitu, kandungan berbeza daripada berbilang baris di bawah lajur yang sama digunakan sebagai berbilang medan dan yang sepadan kandungan adalah output.

Pernyataan penciptaan jadual

DROP TABLE IF EXISTS tb_score;
CREATE TABLE tb_score(
    id INT(11) NOT NULL auto_increment,
    userid VARCHAR(20) NOT NULL COMMENT '用户id',
    subject VARCHAR(20) COMMENT '科目',
    score DOUBLE COMMENT '成绩',
    PRIMARY KEY(id)
)ENGINE = INNODB DEFAULT CHARSET = utf8;
Salin selepas log masuk

Sisipkan data

INSERT INTO tb_score(userid,subject,score) VALUES ('001','语文',90);
INSERT INTO tb_score(userid,subject,score) VALUES ('001','数学',92);
INSERT INTO tb_score(userid,subject,score) VALUES ('001','英语',80);
INSERT INTO tb_score(userid,subject,score) VALUES ('002','语文',88);
INSERT INTO tb_score(userid,subject,score) VALUES ('002','数学',90);
INSERT INTO tb_score(userid,subject,score) VALUES ('002','英语',75.5);
INSERT INTO tb_score(userid,subject,score) VALUES ('003','语文',70);
INSERT INTO tb_score(userid,subject,score) VALUES ('003','数学',85);
INSERT INTO tb_score(userid,subject,score) VALUES ('003','英语',90);
INSERT INTO tb_score(userid,subject,score) VALUES ('003','政治',82);
Salin selepas log masuk

Soal kandungan dalam jadual data (iaitu, hasil sebelum penukaran)

SELECT * FROM tb_score
Salin selepas log masuk

Mari kita lihat hasil yang ditukar dahulu:

Bagaimana untuk menukar baris kepada lajur dalam mysql

Dapat dilihat bahawa penukaran baris di sini adalah untuk memilih berbilang baris medan subjek asal sebagai set keputusan Lajur yang berbeza dikumpulkan mengikut id pengguna untuk memaparkan skor yang sepadan.

1. Use case...bila....kemudian untuk menukar baris dan lajur

SELECT userid,
SUM(CASE `subject` WHEN '语文' THEN score ELSE 0 END) as '语文',
SUM(CASE `subject` WHEN '数学' THEN score ELSE 0 END) as '数学',
SUM(CASE `subject` WHEN '英语' THEN score ELSE 0 END) as '英语',
SUM(CASE `subject` WHEN '政治' THEN score ELSE 0 END) as '政治' 
FROM tb_score 
GROUP BY userid
Salin selepas log masuk

2 baris Lajur:

SELECT userid,
SUM(IF(`subject`='语文',score,0)) as '语文',
SUM(IF(`subject`='数学',score,0)) as '数学',
SUM(IF(`subject`='英语',score,0)) as '英语',
SUM(IF(`subject`='政治',score,0)) as '政治' 
FROM tb_score 
GROUP BY userid
Salin selepas log masuk

Nota:

(1) SUM() boleh menggunakan GROUP BY kepada kumpulan mengikut userid, kerana setiap userid sepadan dengan subjek= "language "Hanya terdapat satu rekod, jadi nilai SUM() adalah sama dengan nilai skor yang sepadan dengan rekod itu.

Jika terdapat dua rekod dengan userid ='001' dan subject='中文', maka nilai SUM() akan menjadi jumlah kedua-dua rekod ini Begitu juga, gunakan Max() Nilainya nilai terbesar antara dua rekod. Tetapi dalam keadaan biasa, pengguna hanya mempunyai satu skor yang sepadan dengan subjek, jadi fungsi agregat seperti SUM(), MAX(), MIN() dan AVG() boleh digunakan untuk mencapai kesan penukaran baris.

(2) JIKA(`subjek`='中文',skor,0) sebagai syarat, iaitu, operasi SUM(), MAX(), MIN( ), AVG(), jika skor mempunyai tiada nilai, ia lalai kepada 0.

3. Gunakan SUM(IF()) untuk menjana lajur DENGAN ROLLUP untuk menjana baris ringkasan dan gunakan IFNULL untuk memaparkan tajuk baris ringkasan sebagai Jumlah

SELECT IFNULL(userid,'total') AS userid,
SUM(IF(`subject`='语文',score,0)) AS 语文,
SUM(IF(`subject`='数学',score,0)) AS 数学,
SUM(IF(`subject`='英语',score,0)) AS 英语,
SUM(IF(`subject`='政治',score,0)) AS 政治,
SUM(IF(`subject`='total',score,0)) AS total
FROM(
    SELECT userid,IFNULL(`subject`,'total') AS `subject`,SUM(score) AS score
    FROM tb_score
    GROUP BY userid,`subject`
    WITH ROLLUP
    HAVING userid IS NOT NULL
)AS A 
GROUP BY userid
WITH ROLLUP;
Salin selepas log masuk

menjalankan hasil :

Bagaimana untuk menukar baris kepada lajur dalam mysql

4 Gunakan SUM(IF()) untuk menjana lajur UNION untuk menjana baris ringkasan dan gunakan IFNULL untuk memaparkan tajuk baris ringkasan sebagai. Jumlah

SELECT userid,
SUM(IF(`subject`='语文',score,0)) AS 语文,
SUM(IF(`subject`='数学',score,0)) AS 数学,
SUM(IF(`subject`='英语',score,0)) AS 英语,
SUM(IF(`subject`='政治',score,0)) AS 政治,
SUM(score) AS TOTAL 
FROM tb_score
GROUP BY userid
UNION
SELECT 'TOTAL',SUM(IF(`subject`='语文',score,0)) AS 语文,
SUM(IF(`subject`='数学',score,0)) AS 数学,
SUM(IF(`subject`='英语',score,0)) AS 英语,
SUM(IF(`subject`='政治',score,0)) AS 政治,
SUM(score) FROM tb_score
Salin selepas log masuk

Jalankan hasil:

Bagaimana untuk menukar baris kepada lajur dalam mysql

5. Gunakan SUM(IF()) untuk menjana lajur dan jana terus hasil tanpa menggunakan subqueries

SELECT IFNULL(userid,'TOTAL') AS userid,
SUM(IF(`subject`='语文',score,0)) AS 语文,
SUM(IF(`subject`='数学',score,0)) AS 数学,
SUM(IF(`subject`='英语',score,0)) AS 英语,
SUM(IF(`subject`='政治',score,0)) AS 政治,
SUM(score) AS TOTAL 
FROM tb_score
GROUP BY userid WITH ROLLUP;
Salin selepas log masuk

Hasil operasi:

Bagaimana untuk menukar baris kepada lajur dalam mysql

6. Dinamik, sesuai untuk ketidakpastian lajur

SET @EE='';
select @EE :=CONCAT(@EE,'sum(if(subject= \'',subject,'\',score,0)) as ',subject, ',') AS aa FROM (SELECT DISTINCT subject FROM tb_score) A ;
SET @QQ = CONCAT('select ifnull(userid,\'TOTAL\')as userid,',@EE,' sum(score) as TOTAL from tb_score group by userid WITH ROLLUP');
-- SELECT @QQ;
PREPARE stmt FROM @QQ;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Salin selepas log masuk

Hasil berjalan:

Bagaimana untuk menukar baris kepada lajur dalam mysql

7 Paparan medan Gabung: Gunakan group_concat()

SELECT userid,GROUP_CONCAT(`subject`,":",score)AS 成绩 FROM tb_score
GROUP BY userid
Salin selepas log masuk

Hasil yang dijalankan:

Bagaimana untuk menukar baris kepada lajur dalam mysql

group_concat(), manual menyatakan: Fungsi ini mengembalikan hasil rentetan dengan nilai bukan NULL untuk penggabungan daripada kumpulan.

Relatif abstrak dan sukar difahami. Untuk memahaminya dengan cara yang mudah, ia sebenarnya seperti ini: group_concat() akan mengira baris mana yang tergolong dalam kumpulan yang sama dan memaparkan lajur milik kumpulan yang sama. Lajur yang hendak dikembalikan ditentukan oleh parameter fungsi (nama medan). Mesti ada standard untuk kumpulan, iaitu mengumpulkan mengikut lajur yang ditentukan oleh kumpulan mengikut.

Kesimpulan: Fungsi group_concat() boleh menukar berbilang baris kepunyaan kumpulan yang sama kepada satu lajur.

Pembelajaran yang disyorkan: tutorial video mysql

Atas ialah kandungan terperinci Bagaimana untuk menukar baris kepada lajur dalam mysql. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan