青鸟遇鱼 2022-03-05 14:37 采纳率: 66.7%
浏览 40
已结题

怎么使用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条回答 默认 最新

  • DarkAthena ORACLE应用及数据库设计方案咨询师 2022-03-05 16:08
    关注
    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中全选复制、选择性粘贴、勾上转置的方式来处理要快得多

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 3月13日
  • 已采纳回答 3月5日
  • 修改了问题 3月5日
  • 创建了问题 3月5日

悬赏问题

  • ¥50 h5唤醒支付宝并跳转至向小荷包转账界面
  • ¥15 算法题:数的划分,用记忆化DFS做WA求调
  • ¥15 chatglm-6b应用到django项目中,模型加载失败
  • ¥15 武汉岩海低应变分析软件,导数据库里不显示波形图
  • ¥15 CreateBitmapFromWicBitmap内存释放问题。
  • ¥30 win c++ socket
  • ¥30 CanMv K210开发板实现功能
  • ¥15 C# datagridview 栏位进度
  • ¥15 vue3页面el-table页面数据过多
  • ¥100 vue3中融入gRPC-web