Skip to content

Commit c81baee

Browse files
committed
sql行列转化
1 parent 0e02313 commit c81baee

File tree

1 file changed

+26
-12
lines changed

1 file changed

+26
-12
lines changed

mysql开发技巧二/如何进行行列转化

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ SQL开发技巧(二)
77
********************************************************************************
88
需要进行行转列的场景:报表统计、汇总显示
99

10+
********************************************************************************
11+
行转列的关键是union ,列转行的关键是join
12+
1013
********************************************************************************
1114
行转列:
1215
1.利用自身连接来实现:
@@ -102,15 +105,26 @@ select user_name,'clothing' as equipment, clothing from user1 a join user1_equip
102105
union all
103106
select user_name,'shoe' as equipment, shoe from user1 a join user1_equipment b on a.id=user_id
104107

105-
106-
107-
108-
109-
110-
111-
112-
113-
114-
115-
116-
108+
********************************************************************************
109+
使用序列化表进行行列转换。
110+
111+
1.首先我们先建立一个序列表<br>
112+
2.思路:<br>
113+
首先我们通过cross join 将user1_equipment 和 序列表 进行笛卡尔积,变成最终有多少条记录 c.id 必须小于等于user1_equipment的列数<br>
114+
再通过case语句,分别取c.id=1,2,3...的对应的行的值,加上coalesce取不为空的数据<br>
115+
ent 和 序列表 进行笛卡尔积,变成最终有多少条记录 c.id 必须小于等于user1_equipment的列数<br>
116+
最后加上对应的列名,<br>行的值,加上coalesce取不为空的数据<br>
117+
示例如下:<br>
118+
SELECT user_name,<br>
119+
CASE WHEN c.id = 1 THEN 'arms'<br>
120+
WHEN c.id = 2 THEN 'clothing'<br><br>
121+
WHEN c.id = 3 THEN 'shoe'<br>br>
122+
END AS equipment,<br>//生成装备列
123+
COALESCE(<br>
124+
CASE WHEN c.id = 1 THEN arms END<br>
125+
CASE WHEN c.id = 2 THEN clothing END<br>
126+
CASE WHEN c.id = 3 WHEN shoe END <br>
127+
) AS eq_name<br>//coalesce取不为空的数据,那条不为空取那一条
128+
FROM user1 a<br>
129+
JOIN user1_equipment b ON a.id=b.user_id<br>
130+
CROSS JOIN tb_sequence c WHERE c.id <= 3 ORDER BY user_name;

0 commit comments

Comments
 (0)