(1)动态,适用于列不确定情况
1
2
3
4
5
6
|
create table table_name( id int primary key , col1 char (2), col2 char (2), col3 int ); |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
insert into table_name values (1 , 'A1' , 'B1' ,9), (2 , 'A2' , 'B1' ,7), (3 , 'A3' , 'B1' ,4), (4 , 'A4' , 'B1' ,2), (5 , 'A1' , 'B2' ,2), (6 , 'A2' , 'B2' ,9), (7 , 'A3' , 'B2' ,8), (8 , 'A4' , 'B2' ,5), (9 , 'A1' , 'B3' ,1), (10 , 'A2' , 'B3' ,8), (11 , 'A3' , 'B3' ,8), (12 , 'A4' , 'B3' ,6), (13 , 'A1' , 'B4' ,8), (14 , 'A2' , 'B4' ,2), (15 , 'A3' , 'B4' ,6), (16 , 'A4' , 'B4' ,9), (17 , 'A1' , 'B4' ,3), (18 , 'A2' , 'B4' ,5), (19 , 'A3' , 'B4' ,2), (20 , 'A4' , 'B4' ,5); |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
select * from table_name; + ----+------+------+------+ | id | col1 | col2 | col3 | + ----+------+------+------+ | 1 | A1 | B1 | 9 | | 2 | A2 | B1 | 7 | | 3 | A3 | B1 | 4 | | 4 | A4 | B1 | 2 | | 5 | A1 | B2 | 2 | | 6 | A2 | B2 | 9 | | 7 | A3 | B2 | 8 | | 8 | A4 | B2 | 5 | | 9 | A1 | B3 | 1 | | 10 | A2 | B3 | 8 | | 11 | A3 | B3 | 8 | | 12 | A4 | B3 | 6 | | 13 | A1 | B4 | 8 | | 14 | A2 | B4 | 2 | | 15 | A3 | B4 | 6 | | 16 | A4 | B4 | 9 | | 17 | A1 | B4 | 3 | | 18 | A2 | B4 | 5 | | 19 | A3 | B4 | 2 | | 20 | A4 | B4 | 5 | + ----+------+------+------+ |
1
2
3
4
5
|
SET @EE= '' ; SELECT @EE:=CONCAT(@EE, 'SUM(IF(col2=\'' ,col2, '\'' , ',col3,0)) AS ' ,col2, ',' ) FROM ( SELECT DISTINCT col2 FROM table_name) A; SET @QQ=CONCAT( 'SELECT ifnull(col1,\'total\') AS columnA,' , LEFT (@EE,LENGTH(@EE)-1), ' ,SUM(col3) AS TOTAL FROM table_name GROUP BY col1 WITH ROLLUP' ); PREPARE stmt2 FROM @QQ; EXECUTE stmt2; |
1
2
3
4
5
6
7
8
9
|
+ ---------+------+------+------+------+-------+ | columnA | B1 | B2 | B3 | B4 | TOTAL | + ---------+------+------+------+------+-------+ | A1 | 9 | 2 | 1 | 11 | 23 | | A2 | 7 | 9 | 8 | 7 | 31 | | A3 | 4 | 8 | 8 | 8 | 28 | | A4 | 2 | 5 | 6 | 14 | 27 | | total | 22 | 24 | 23 | 40 | 109 | + ---------+------+------+------+------+-------+ |
(2)第二个字段确定的情况下使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
SELECT IFNULL(col1, 'total' ) AS total, SUM (IF(col2= 'B1' ,col3,0)) AS B1, SUM (IF(col2= 'B2' ,col3,0)) AS B2, SUM (IF(col2= 'B3' ,col3,0)) AS B3, SUM (IF(col2= 'B4' ,col3,0)) AS B4, SUM (IF(col2= 'total' ,col3,0)) AS total FROM ( SELECT col1,IFNULL(col2, 'total' ) AS col2, SUM (col3) AS col3 FROM table_name GROUP BY col1,col2 WITH ROLLUP HAVING col1 IS NOT NULL ) AS A GROUP BY col1 WITH ROLLUP ; |
注: WITH ROLLUP 用于列上求和; SUM(IF(col2='total',col3,0)) AS total 用于行上求和。
(3)第二个字段确定的情况下使用
1
2
3
4
5
6
7
|
select ifnull(col1, 'total' ) AS col1, sum (if(col2= 'B1' ,col3,0)) AS B1, sum (if(col2= 'B2' ,col3,0)) AS B2, sum (if(col2= 'B3' ,col3,0)) AS B3, sum (if(col2= 'B4' ,col3,0)) AS B4, SUM (col3) AS TOTAL from table_name group by col1 with rollup ; |
以上这篇mysql 行列动态转换的实现(列联表,交叉表)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。