首页 > 数据库 >【MySQL】mysql | 数据处理 | 行转列 | 一种行转列的处理思路

【MySQL】mysql | 数据处理 | 行转列 | 一种行转列的处理思路

时间:2022-11-25 11:02:51浏览次数:33  
标签:code ke money MySQL mu 转列 2022 mysql org


一、说明

        1、mysql数据库

        2、行转列场景,对于不同行业来说,使用频率不一样

        3、本文档仅提供一种行转列的思路,仅做参考

二、开始

1、假设场景

1)以财务数据为例,但非专业的财务数据

2)财务数据有: 年,月,科目,金额,子公司编码,子公司名称

3)创建存储表结构
create table t_ke_mu_money(
id int primary key auto_increment comment '主键自增',
year int comment '年',
month int comment '月',
ke_mu varchar(32) default '' comment '科目',
money decimal(15,3) default 0.0 comment '金额',
org_code varchar(32) default '' comment '子公司编码',
org_name varchar(32) default '' comment '子公司名称'
) comment '科目金额'
4)插入测试数据
insert into t_ke_mu_money (year,month,ke_mu,money, org_code,org_name) values (2022,8,'现金', 100, '01', '子公司01');
insert into t_ke_mu_money (year,month,ke_mu,money, org_code,org_name) values (2022,8,'资产', 200, '01', '子公司01');
insert into t_ke_mu_money (year,month,ke_mu,money, org_code,org_name) values (2022,8,'人员工资', 300, '01', '子公司01');

insert into t_ke_mu_money (year,month,ke_mu,money, org_code,org_name) values (2022,7,'现金', 90, '01', '子公司01');
insert into t_ke_mu_money (year,month,ke_mu,money, org_code,org_name) values (2022,7,'资产', 200, '01', '子公司01');
insert into t_ke_mu_money (year,month,ke_mu,money, org_code,org_name) values (2022,7,'人员工资', 290, '01', '子公司01');
insert into t_ke_mu_money (year,month,ke_mu,money, org_code,org_name) values (2022,7,'现金', 90, '02', '子公司02');
insert into t_ke_mu_money (year,month,ke_mu,money, org_code,org_name) values (2022,7,'资产', 200, '02', '子公司02');


5)需求

a> 获取所有子公司2022年7月,现金金额与人员工资金额;一行展示一个子公司的现金金额,人员工资金额

b> 可能存在多条相同的记录;保留一条即可

c> 展示所有子公司

~~

2、解决分析

1)行转列很明确了,首先想到查询然后通过left join关联

2)数据可能重复,需要考虑去重

3)行转列可以通过一个大sql处理,但是我这边选择用临时表

4)考虑到去重,去重方案有很多,可以选择删除重复数据,也可以选择不删除;需求中没有说明是否允许删除原始数据,所以我这边选择不动原始数据的方案

5)大致处理思路: 优先去重,然后获取子公司的全集,然后创建临时表,最后查询并转换成目标数据结构

3、解决步骤

1)优先去重,创建去重后的数据临时表
drop table if exists t_tmp_ke_mu_money_dis;
create table t_tmp_ke_mu_money_dis
as
select year, month,ke_mu ,money, org_code, org_name
from t_ke_mu_money
group by year, month,ke_mu, money , org_code, org_name
;
说明1: 使用group by分组去重;不考虑相同年月,相同科目,金额不同的场景(需求已经明确说过金额相同,即业务数据提供方保证数据的正确性)
2)获取所有子公司全集,并创建临时表
drop table if exists t_tmp_ke_mu_org_dis;
create table t_tmp_ke_mu_org_dis
as
select org_code, org_name
from t_tmp_ke_mu_money_dis
group by org_code, org_name
;
说明1: 展示所有科目,即科目为最左数据基础,left join时使用
说明2: 如果不以所有科目为数据基础,当某一科目不存在时,就会导致left join右边有数据的表关联不上
3)获取7月份,并创建临时表
drop table if exists t_tmp_ke_mu_money_2022_7;
create table t_tmp_ke_mu_money_2022_7
as
select ke_mu,money, org_code, org_name
from t_tmp_ke_mu_money_dis
where year = 2022 and month = 7
4)获取7月份现金数据,并创建临时表
drop table if exists t_tmp_ke_mu_money_2022_7_xian_jin;
create table t_tmp_ke_mu_money_2022_7_xian_jin
as
select money as xj_money,org_code, org_name
from t_tmp_ke_mu_money_2022_7
where ke_mu = '现金'
5)获取7月份人员工资,并创建临时表
drop table if exists t_tmp_ke_mu_money_2022_7_ren_yuan_gong_zi;
create table t_tmp_ke_mu_money_2022_7_ren_yuan_gong_zi
as
select money as rygz_money,org_code, org_name
from t_tmp_ke_mu_money_2022_7
where ke_mu = '人员工资'
6)最终查询
select org.org_code as org_code, org.org_name as org_name, xj_money,rygz_money, 2022 as year, 7 as month
from t_tmp_ke_mu_org_dis org
left join t_tmp_ke_mu_money_2022_7_xian_jin xj
on org.org_code = xj.org_code
left join t_tmp_ke_mu_money_2022_7_ren_yuan_gong_zi rygz
on org.org_code = rygz.org_code
说明1: 查询子公司全集
说明2: 关联“现金”
说明3: 关联“人员工资”
说明4: on 的条件,均以org.org_code为左边条件;org即子公司org_code全集
7)结果示意图
a> 原始数据
select * from t_ke_mu_money


【MySQL】mysql | 数据处理 | 行转列 | 一种行转列的处理思路_mysql

b> 需求结果

select org.org_code as org_code, org.org_name as org_name, xj_money,rygz_money, 2022 as year, 7 as month
from t_tmp_ke_mu_org_dis org
left join t_tmp_ke_mu_money_2022_7_xian_jin xj
on org.org_code = xj.org_code
left join t_tmp_ke_mu_money_2022_7_ren_yuan_gong_zi rygz
on org.org_code = rygz.org_code

【MySQL】mysql | 数据处理 | 行转列 | 一种行转列的处理思路_mysql_02

~~

4、为什么使用临时表?

1)临时表,不改动原始数据;对源数据算是一个保护

2)临时表,可以随时删除,随时重建

3)临时表,优先过滤出需要处理的数据,不需要从原数据全表扫描

4)临时表,整个流程是模块化的,比如现在需求的是2022年7月的数据,如果需要2022年8月的数据;整个流程的sql做个微调就可以直接使用而且不影响2022年7月的数据

5)我的业务场景需要临时表,因为使用kettle写同步数据的脚本;每次的源数据都是全量修改的,源数据表删除后重建;临时表不影响已经处理过的数据(视图的话,数据就没了,表没了,视图也就没了);源数据调整,只需要重新执行kettle脚本即可(因为我的临时表也是先删除,再重建,跟业务场景保持一致)

5、临时表可以换成视图吗?

1)这个根据自己的业务场景判断即可

2)我的场景需要用临时表;假如你的场景不存在源数据表的删除与重建,就可以使用视图

3)视图,动态维护数据,也不错

标签:code,ke,money,MySQL,mu,转列,2022,mysql,org
From: https://blog.51cto.com/u_15891242/5885740

相关文章

  • 使用DBeaver链接PostgreSQL(MySQL)显示所有数据库
             ......
  • CentOS7.9 MySQL5.1 安装
    1.下载相关mysql源码包wgethttps://downloads.mysql.com/archives/get/p/23/file/mysql-5.1.63-linux-x86_64-glibc23.tar.gz2.安装相关依赖包yuminstallbisongcc......
  • mysql表、数据库快速复制
    停止mysql服务ALTERTABLEtable_nameDISCARDTABLESPACE;将原数据库的\mysql-8.0.25-winx64\data\中的ibd文件复制到对应数据库中,ALTERTABLEtable_nameIMPORTTABL......
  • MySQL进阶实战3,mysql索引详解,上篇
    一、索引索引是存储引擎用于快速查找记录的一种数据结构。我觉得数据库中最重要的知识点,就是索引。存储引擎以不同的方式使用B-Tree索引,性能也各有不同,各有优劣。例如MyI......
  • windows上安装mysql-5.6.44-winx64
     配置MySQL配置文件my.ini。datadir一般和安装目录是分开存放的[mysqld]#设置3306端口port=3306#设置mysql的安装目录---这里输入你安装的文件路径----basedir=......
  • 基于javafx+java+mysql的图书管理系统
    功能展示1.登录2.主界面3.图书类别添加4.图书类别维护5.图书添加6.图书维护......
  • 第8节-MySQL索引与视图
    8.1、索引8.1.1、索引优缺点索引的优点:1、可以提高查询数据的速度;2、通过创建唯一索引,可以保证数据库表中每一行数据的唯一性;3、在实现数据的参考完整性方面,可以......
  • 第9节-MySQL存储过程
    9.1、存储过程概述1、存储过程的定义定义一段完成特定功能的SQL语句集,经编译后存储在数据库中,用户可以通过指定的存储过程名称并给出参数来执行它,这样的语句集称为存......
  • 第10节-MySQL数据库的编程基础
     10.1、变量、运算符介绍用户变量:使用@开头。【set定义,会话有效】系统变量:使用@@开头。【declare定义,begin..end有效】局部变量:在存储过程中有效。--1、用户变......
  • 第11节-MySQL存储函数
    11.1、函数介绍1、函数是存储在服务器端的SQL语句的集合2、函数分为MySQL提供的内部函数和用户自定义医数两大类.MySQL提供了很丰富的内部函数·数学函数·字符串医......