当前位置:首页 > 技术分析 > 正文内容

MySQL不确定字段建表(横表纵表转换)

ruisui883个月前 (02-08)技术分析14

前两天难得有个朋友留言问了一个数据库建表的问题,也欢迎大家多留言多提问。大概是需要建表的字段不确定,可能后续会根据业务的需求增加一些字段,然后这位朋友其实也给了一个使用纵表的解决方案。其实我对建表也了解不多,但是不影响嘛,就像之前美团老大兴哥对"我不会,但是我可以学"这个高度赞扬一样,我遇到这种对我来说的新问题也是很兴奋的,于是,我也可以去学,查了一些资料,自己再思考了一下,于是出现了这一篇短文。

我先描述一下数据,大概如下,我们需要对每个人每个月的工资条进行存储,包括基础的信息(姓名、月份、部门、基本工资和各项常规税费)和每个人特殊的费用项目,比如差旅费、招待费等等。前面基础信息部分因为字段是固定的,所以固定字段建表就可以了;但是其他费用项目每个月都不一样,而且每个月可能还会新增费用项目,所以如果固定建表就需要每个月增加字段,而且很多字段只有个别人需要,对其他人来说是很浪费存储空间的。

所有这个时候就需要想办法来解决这个问题了。思路是使用横纵两个表就行存储,确定的字段就用常规的横表进行存储,其他费用项目就用纵表就行存储。还有一个思路就是其他费用项目单独用一个json字段进行存储,这样也很自由,但是如果数据量很大的时候,查询起来速度会有点影响。

思路就是这样,下面就演示一下横纵表之间的查询转换,和json格式字段的查询。


【横表转纵表】

横表就是我们日常最常见的表格,思路是把每个项目的金额单独查询出来然后连接到一起,下面是横表转纵表的SQL查询语句↓

SELECT 姓名,月份,部门,"基本工资" AS 项目费用,基本工资 AS 金额 FROM `工资表`
UNION ALL
SELECT 姓名,月份,部门,"绩效工资" AS 项目费用,绩效工资 AS 金额 FROM `工资表`
UNION ALL
SELECT 姓名,月份,部门,"社保" AS 项目费用,社保 AS 金额 FROM `工资表`
UNION ALL
SELECT 姓名,月份,部门,"公积金" AS 项目费用,公积金 AS 金额 FROM `工资表`
UNION ALL
SELECT 姓名,月份,部门,"个税" AS 项目费用,个税 AS 金额 FROM `工资表`


【纵表转横表】

上面生成的结果就是纵表了,然后我们创建一张纵表,格式如下↓


下面是纵表转横表的SQL查询语句,思路是把每个费用项目查询出来,结果只有指定项的字段有数据,再使用MAX聚合函数结合GROUP BY就可以得到我们想要的形式了↓

SELECT 姓名,月份,部门,
 MAX(CASE 项目费用 WHEN '基本工资' THEN 金额 ELSE NULL END) AS 基本工资,
 MAX(CASE 项目费用 WHEN '绩效工资' THEN 金额 ELSE NULL END) AS 绩效工资,
 MAX(CASE 项目费用 WHEN '社保' THEN 金额 ELSE NULL END) AS 社保,
 MAX(CASE 项目费用 WHEN '公积金' THEN 金额 ELSE NULL END) AS 公积金,
 MAX(CASE 项目费用 WHEN '个税' THEN 金额 ELSE NULL END) AS 个税
FROM
 工资表纵表
GROUP BY
 姓名,月份,部门


这个时候如果我们需要增加几项特殊的费用,比如一项差旅费,一项高温补贴费,一项疫情补贴费,SQL查询和结果如下↓

SELECT 姓名,月份,部门,
 MAX(CASE 项目费用 WHEN '基本工资' THEN 金额 ELSE NULL END) AS 基本工资,
 MAX(CASE 项目费用 WHEN '绩效工资' THEN 金额 ELSE NULL END) AS 绩效工资,
 MAX(CASE 项目费用 WHEN '社保' THEN 金额 ELSE NULL END) AS 社保,
 MAX(CASE 项目费用 WHEN '公积金' THEN 金额 ELSE NULL END) AS 公积金,
 MAX(CASE 项目费用 WHEN '个税' THEN 金额 ELSE NULL END) AS 个税,
 MAX(CASE 项目费用 WHEN '差旅费' THEN 金额 ELSE NULL END) AS 差旅费,
 MAX(CASE 项目费用 WHEN '高温补贴费' THEN 金额 ELSE NULL END) AS 高温补贴费,
 MAX(CASE 项目费用 WHEN '疫情补贴费' THEN 金额 ELSE NULL END) AS 疫情补贴费
FROM
 工资表纵表
GROUP BY
 姓名,月份,部门


【JSON格式读取】

上面使用的是横纵两个表进行存储的,现在可以在横标里面加一个JSON格式字段用于灵活存储其他费用,这样就可以使用一个表存储就行了,表格内容如下↓


然后使用获取JSON格式的SQL语句就可以查询出对应的字段了,关于JSON格式创建和查询,后面再单独拿一篇来讲,这里的SQL语句如下↓

SELECT
  姓名,
  月份,
  部门,
  基本工资,
  绩效工资,
  社保,
  公积金,
  个税,
  json_extract(others,"$.chailv") AS 差旅费,
  others->'$.gaowen' as 高温费,
  others->'$.yiqing' as 疫情补助
FROM
  工资表


好了,今天就到这里,欢迎多留言多提问~

End

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/1796.html

标签: json_extract
分享给朋友:

“MySQL不确定字段建表(横表纵表转换)” 的相关文章

带你五步学会Vue SSR

作者:liuxuan 前端名狮转发链接:https://mp.weixin.qq.com/s/6K6GUHcLwLG4mzfaYtVMBQ前言SSR大家肯定都不陌生,通过服务端渲染,可以优化SEO抓取,提升首页加载速度等,我在学习SSR的时候,看过很多文章,有些对我有很大的启发作用,有些就只是照搬官...

10分钟搞定gitlab-ci自动化部署

gitlab-ci 是持续集成工具/自动化部署工具,类似 jenkins。持续集成 是将代码集成到共享存储库并尽可能早地自动构建/测试每个更改的实践 - 通常一天几次。概述在编码完成时都会进行打包发布过程,如果每次都手动操作这一步骤就会浪费时间,效率低下。所以就有了持续集成。准备事项请提前安装以下软...

编码 10000 个小时后,开发者悟了:“不要急于发布!”

【CSDN 编者按】在软件开发的道路上,时间是最好的老师。根据“一万小时定律”,要成为某个领域的专家,通常需要大约一万小时的刻意练习。本文作者身为一名程序员,也经历了一万小时的编程,最终悟出了一个道理:慢即是快,重视架构设计和代码质量,确保每一行代码都经得起时间的考验。作者 | Sotiris Ko...

7 招教你轻松搭建以图搜图系统

作者 | 小龙责编 | 胡巍巍当您听到“以图搜图”时,是否首先想到了百度、Google 等搜索引擎的以图搜图功能呢?事实上,您完全可以搭建一个属于自己的以图搜图系统:自己建立图片库;自己选择一张图片到库中进行搜索,并得到与其相似的若干图片。Milvus 作为一款针对海量特征向量的相似性检索引擎,旨在...

HTML5最新版本介绍

HTML5是HTML4.01和XHTML1.0之后超文本标记语言的最新版本,由一群自由思想者设计,最终实现了多媒体支持、交互性、更智能的表单和更好的语义标注。 HTML 5不只是 HTML规范的最新版本,它是用于生成现代 Web内容的一系列相关技术的总称,其中最重要的三个技术是:HTML5核心规范...

双子座应用程序推出模型切换器以在Android上访问2.0

#头条精品计划# 快速导读谷歌推出了Gemini 2.0 Flash实验版,现已在其安卓应用中可用,之前仅在gemini.google.com网站上提供。新版本的15.50包含模型切换器,用户可以在设置中选择不同模型,包括1.5 Pro、1.5 Flash和2.0 Flash实验版。谷歌提醒,2.0...