各位用户为了找寻关于mysql 行列动态转换的实现(列联表,交叉表)的资料费劲了很多周折。这里教程网为您整理了关于mysql 行列动态转换的实现(列联表,交叉表)的相关资料,仅供查阅,以下为您介绍关于mysql 行列动态转换的实现(列联表,交叉表)的详细内容
(1)动态,适用于列不确定情况
? 1 2 3 4 5 6create
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 16SELECT
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 7select
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 行列动态转换的实现(列联表,交叉表)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。