@@ -7,6 +7,9 @@ SQL开发技巧(二)
7
7
********************************************************************************
8
8
需要进行行转列的场景:报表统计、汇总显示
9
9
10
+ ********************************************************************************
11
+ 行转列的关键是union ,列转行的关键是join
12
+
10
13
********************************************************************************
11
14
行转列:
12
15
1.利用自身连接来实现:
@@ -102,15 +105,26 @@ select user_name,'clothing' as equipment, clothing from user1 a join user1_equip
102
105
union all
103
106
select user_name,'shoe' as equipment, shoe from user1 a join user1_equipment b on a.id=user_id
104
107
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