在一张数据表中有多个中文列,怎么使用msql对这些列进行转成行的处理。
--显示mysql版本'5.7.36'select version();
-- 例如下面的的数据:
DROP TABLE IF EXISTS ld_cust_mm ;
CREATE TABLE IF NOT EXISTS ldc.ld_cust_mm
(
name VARCHAR(50)
,emp_name VARCHAR(100)
,s_name VARCHAR(100)
,c_name VARCHAR(100)
) ;
INSERT INTO ld_cust_mm VALUES ('老大','张三','华联','辣条' );
INSERT INTO ld_cust_mm VALUES ('老二','李四','物美','苹果' );
INSERT INTO ld_cust_mm VALUES ('老三','李逵','优衣','T恤' );
INSERT INTO ld_cust_mm VALUES ('老四','李明','三星','手机' );
INSERT INTO ld_cust_mm VALUES ('老五','王君','艾尔','大宝' );
INSERT INTO ld_cust_mm VALUES ('.等等.','...','...','...' );
SELECT * FROM ld_cust_mm ;
-- 最终需要呈现的结果:
DROP TABLE IF EXISTS ld_cc ;
CREATE TABLE IF NOT EXISTS ld_cc
(
name1 VARCHAR(50)
,name2 VARCHAR(100)
,name3 VARCHAR(100)
,name4 VARCHAR(100)
,name5 VARCHAR(100)
) ;
insert into ld_cc values ('老大','老二','老三','老四','老五') ;
insert into ld_cc values ('张三','李四','李逵','李明','王君') ;
insert into ld_cc values ('华联','物美','优衣','三星','艾尔') ;
insert into ld_cc values ('辣条','苹果','T恤','手机','大宝') ;
SELECT * FROM ld_cc ;
另外,如果你英文列可以转,那么中文列也可以使用同样的方法转,这两者在逻辑上并没有什么区别
mysql 5.7 及以下版本支持的sql写法比8少多了,所以写这种sql会比较繁琐。
另外,sql标准是,一个sql必须有确定的列数和列名,你这个例子中是5行变5列,那么写出来的sql也就只能5行变5列,不能因为数据中有6行而自动变成6列。
还有,必须确定行号,因为如果没有确定的顺序,是不清楚你表里面哪一行是第一行的,所以我在你原表中加入了一个id字段用来识别顺序
下面是mysql5.7支持的写法之一
--测试数据
CREATE TABLE IF NOT EXISTS ld_cust_mm
(id int,
name VARCHAR(50)
,emp_name VARCHAR(100)
,s_name VARCHAR(100)
,c_name VARCHAR(100)
) ;
INSERT INTO ld_cust_mm VALUES (1,'老大','张三','华联','辣条' );
INSERT INTO ld_cust_mm VALUES (2,'老二','李四','物美','苹果' );
INSERT INTO ld_cust_mm VALUES (3,'老三','李逵','优衣','T恤' );
INSERT INTO ld_cust_mm VALUES (4,'老四','李明','三星','手机' );
INSERT INTO ld_cust_mm VALUES (5,'老五','王君','艾尔','大宝' );
--查询sql
select
max(case when id=1 then name end ) name1,
max(case when id=2 then name end ) name2,
max(case when id=3 then name end ) name3,
max(case when id=4 then name end) name4,
max(case when id=5 then name end ) name5 from (
SELECT id,'name' tp,name FROM ld_cust_mm union all
SELECT id,'emp_name' tp,emp_name FROM ld_cust_mm union all
SELECT id,'s_name' tp,s_name FROM ld_cust_mm union all
SELECT id,'c_name' tp,c_name FROM ld_cust_mm
) as t group by tp
;
另外,其实这种数据处理,如果允许导出数据,那么在excel中全选复制、选择性粘贴、勾上转置的方式来处理要快得多