怎么使用msql对中文列转行[无奈]

在一张数据表中有多个中文列,怎么使用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 ;

img

  1. 请先说明数据库版本,不同版本支持的sql语法不一样
  2. 请把create table 和insert数据的sql放出来,方便答题人测试
  3. 请以表格的形式说明,最后需要的数据是长什么样子

另外,如果你英文列可以转,那么中文列也可以使用同样的方法转,这两者在逻辑上并没有什么区别


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
;

img

另外,其实这种数据处理,如果允许导出数据,那么在excel中全选复制、选择性粘贴、勾上转置的方式来处理要快得多