当前位置: 首页 > article >正文

SQL与数据库开发(四):CASE WHEN 与“行转列/列转行”花式玩法

在企业级应用的开发中后端程序员和报表工程师往往面临着一种天然的矛盾“数据库的存储格式”与“前端的展示格式”是完全不匹配的。关系型数据库最喜欢“瘦长”的表不断往下插入新行而业务方和老板最喜欢看的是“宽表”交叉表格、数据透视表。比如数据库里存的是每个员工每个月的流水记录但前端页面要求展示成“姓名 | 1月 | 2月 | 3月”的网格形式。如果把这种转换逻辑全部扔到 Java/Go 的内存里去做你需要写大量的对象映射、嵌套Map和遍历逻辑。实际上利用 SQL 中的CASE WHEN结合聚合函数我们可以直接在数据库执行层优雅地完成“行列转换”。一、 经典痛点行转列Pivot需求说明业务方需要一张学生成绩透视表要求一行展示一个学生的所有科目成绩。表结构参考瘦长型student_scores(student_name, subject, score) 里面存储的数据是流水形式的张三语文85张三数学90李四语文80使用 CASE WHEN 的标准解法这是业务开发中最常用的 SQL 魔法业界称之为“条件聚合Conditional Aggregation”。SELECT student_name, SUM(CASE WHEN subject 语文 THEN score ELSE 0 END) AS chinese_score, SUM(CASE WHEN subject 数学 THEN score ELSE 0 END) AS math_score, SUM(CASE WHEN subject 英语 THEN score ELSE 0 END) AS english_score, SUM(score) AS total_score -- 顺手把总分也算出来 FROM student_scores GROUP BY student_name;原理解析与避坑指南为什么要加SUM或MAX很多新手写行转列时会漏掉聚合函数。如果不加SUM直接使用CASE WHEN数据库依然会返回三行数据只是不匹配的科目会显示为 0。加上聚合函数并配合GROUP BY student_name就能将张三的三行数据“压扁”成一行。SUM还是MAX如果一个学生一门课只有一条成绩记录用SUM和MAX结果是一样的。但如果业务场景是“取该科目的历史最高分”则必须用MAX。可移植性MySQL 开发者喜欢用IF(subject 语文, score, 0)。虽然写起来更短但IF是 MySQL 独有的语法。如果你希望你的 SQL 能在 PostgreSQL 或 Oracle 上无缝运行请永远坚持使用标准的CASE WHEN。二、 历史包袱列转行Unpivot需求说明由于早年表结构设计不合理财务表把四个季度的营收硬编码成了四个物理字段。现在前端需要用 Echarts 画时间序列折线图需要把宽表拆回流水表。表结构参考扁宽型financial_reports(company_id, q1_revenue, q2_revenue, q3_revenue, q4_revenue)使用 UNION ALL 的标准解法对于“列转行”最直观、最兼容的方法就是使用UNION ALL进行结果集的垂直拼接。SELECT company_id, Q1 AS quarter, q1_revenue AS revenue FROM financial_reports WHERE q1_revenue IS NOT NULL UNION ALL SELECT company_id, Q2 AS quarter, q2_revenue AS revenue FROM financial_reports WHERE q2_revenue IS NOT NULL UNION ALL SELECT company_id, Q3 AS quarter, q3_revenue AS revenue FROM financial_reports WHERE q3_revenue IS NOT NULL UNION ALL SELECT company_id, Q4 AS quarter, q4_revenue AS revenue FROM financial_reports WHERE q4_revenue IS NOT NULL;工程价值把扁平的列拆成标准的行后你就可以继续对这个结果集使用GROUP BY进行更复杂的统计或者直接丢给前端的图表组件渲染。注意使用UNION ALL而不是UNION前者不进行去重计算性能高出数倍。三、 轻量级合并行转字符串GROUP_CONCAT有时候前端并不要求把科目单独拆成列只是希望在一个格子里面显示所有的标签或流水记录。需求说明查询每个用户的所有偏好标签用逗号隔开。表结构参考user_tags(user_id, tag_name)优雅解法SELECT user_id, GROUP_CONCAT(tag_name ORDER BY tag_name SEPARATOR , ) AS all_tags FROM user_tags GROUP BY user_id;原理解析GROUP_CONCAT是极其强大的文本聚合函数它甚至允许你在合并的过程中先进行ORDER BY排序或者自定义分隔符。它可以瞬间消灭应用层代码里的String.join()操作。四、 架构边界什么时候不应该用 SQL 行列转换以上介绍的都是静态行列转换列数是固定的比如四季、三门课。 如果在实际业务中你的列是动态的例如电商属性今天多了一个“屏幕刷新率”明天多了一个“键盘手感”你想写一个 SQL 自动把这些未知的属性全部转成列。结论是纯 SQL 无法直接实现动态行转列。虽然可以通过拼接字符串执行PREPARE动态语句来硬搞但这不仅极度难以调试还会引发 SQL 注入风险。面对动态透视需求正确的架构做法是将流水数据查询出来交给专业的 BI 工具如 Tableau、Metabase或者前端的 DataGrid 组件进行内存渲染。让数据库只干 I/O 和过滤的苦力活。

相关文章:

SQL与数据库开发(四):CASE WHEN 与“行转列/列转行”花式玩法

在企业级应用的开发中,后端程序员和报表工程师往往面临着一种天然的矛盾:“数据库的存储格式”与“前端的展示格式”是完全不匹配的。 关系型数据库最喜欢“瘦长”的表(不断往下插入新行),而业务方和老板最喜欢看的是…...

Linux系统编程-makefile文件与make命令的使用

目录 一.makefile文件 1.1什么是makefile 1.2 makefile的一、二、三 1.2.1 一个规则 (1) 两个基本原则: (2) 使用 ALL 来指定makefile的终极目标: 1.2.2 两个函数 (1) src $(wildcard *.c) (2) obj $(patsubst %.c, %.o, $(src)) 1.2.3 三个…...

AI Agent集成Kalshi预测市场交易技能:自动化交易与风险管理实战

1. 项目概述:一个为AI Agent设计的Kalshi预测市场交易技能如果你对量化交易、自动化脚本或者新兴的AI Agent生态感兴趣,并且听说过“预测市场”这个概念,那么今天聊的这个项目可能会让你眼前一亮。lacymorrow/openclaw-kalshi-trading-skill本…...

AI伦理编程实战:从公平性算法到可解释性模型的工程实践

1. 项目概述:当代码开始思考,我们该教它什么? “AI伦理编程”这个词,听起来像是一个技术乌托邦,一个我们只要遵循几条规则就能让机器变得善良的简单任务。但当你真正坐下来,试图将“公平”、“透明”、“无…...

机器学习在非洲公共卫生疾病预测中的实战应用与技术解析

1. 项目概述:当AI遇见非洲公共卫生在非洲大陆,公共卫生系统长期面临着资源不均、基础设施薄弱和疾病负担沉重的多重挑战。传统的疾病监测依赖于被动报告和人工数据分析,往往存在滞后性,当疫情警报拉响时,病毒可能已经悄…...

机器学习在非洲传染病预测与监测中的实战应用

1. 项目概述:当AI遇见非洲传染病防控在公共卫生领域,时间就是生命,资源就是防线。对于非洲大陆而言,这句话的分量尤为沉重。这里常年承受着全球最沉重的传染病负担,从水源性传播的霍乱、致命性极高的埃博拉&#xff0c…...

AI赋能风景园林设计:技术原理、实践案例与未来挑战

1. 项目概述:当AI遇见园林最近几年,我身边不少做景观设计的朋友,从最初的“AI能画图?试试看”,到现在的“这个参数化模型帮我省了一周工作量”,态度转变非常明显。这让我意识到,人工智能在风景园…...

AI赋能区域创新评估:融合记分板与政策文本分析的协同框架与实践

1. 项目概述与核心价值 最近在梳理区域创新政策与人工智能应用交叉领域的工作时,我深度实践了一个项目,核心是探讨如何将欧盟的“区域创新记分板”这套成熟的评估体系,与新兴的AI政策分析工具进行深度融合与协同应用。这听起来可能有些学术化…...

ARM Trace单元架构与TRCVICTLR寄存器详解

1. ARM Trace单元架构概述在嵌入式系统开发领域,调试能力往往决定了问题定位的效率和质量。ARM架构提供的Trace单元(Embedded Trace Macrocell, ETM)作为处理器指令执行流追踪的核心组件,已经成为现代SoC调试基础设施的重要组成部…...

使用 Python 快速接入 Taotoken 并调用多模型 API 的完整指南

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 使用 Python 快速接入 Taotoken 并调用多模型 API 的完整指南 对于希望快速集成大模型能力的 Python 开发者而言,逐一对…...

时序逻辑与值函数分解在强化学习中的应用

1. 时序逻辑与值函数分解的核心原理 时序逻辑(Temporal Logic, TL)作为形式化方法的重要分支,其本质是通过数学语言描述系统在时间维度上的行为约束。在控制理论与强化学习领域,TL的价值在于将复杂的任务需求转化为可计算的优化目…...

Arm架构DCU寄存器解析与安全调试实践

1. Arm生命周期管理器DCU寄存器深度解析 在Arm架构的嵌入式系统开发中,生命周期管理器(Lifecycle Manager, LCM)扮演着关键角色,而其中的调试控制单元(Debug Control Unit, DCU)寄存器组则是开发人员必须掌…...

ARM架构CNTP_CVAL寄存器详解与定时器编程实践

1. ARM架构中的CNTP_CVAL寄存器解析 在ARMv8/v9架构中,定时器系统是处理器关键的时间管理组件,而CNTP_CVAL(Counter-timer Physical Timer CompareValue Register)作为EL1物理定时器的比较值寄存器,在实时任务调度、中…...

AI 基本面量化:从理论到可部署 MVP-1.学习目标与工具链

AI 基本面量化实战:从理论到可部署 MVP 的完整学习路径1. 核心目标与 MVP 定义1.1 学习目标定位1.1.1 掌握 AI 技术与基本面分析深度融合的方法论体系AI 基本面量化的本质并非用复杂模型替代经典金融理论,而是以经济学逻辑为锚、以数据驱动为翼&#xff…...

物理 AI 为什么离不开边缘计算?

过去两年,AI 给人的印象基本是一回事——一个对话框,一个输入框。你打字它打字,你上传它分析,AI 安静地待在屏幕里,处理着一切关于文字、图像、代码的事情。行业的注意力也都跟着堆在那一头。云厂商抢算力,…...

3406硬核量化总结:黄大年茶思屋34期5题全解 重塑华为全球全栈技术霸权战略

华夏之光永存・硬核总结:黄大年茶思屋5题全解对华为战略的决定性价值 一、华为核心战略:全栈自主可控,构建端边云网芯一体化技术霸权 华为的核心战略是根技术全自研、全链路闭环、全场景覆盖,以芯片为底座、网络为联接、操作系统为中枢、AI为引擎、云为载体、行业应用为出…...

AI编程效率革命:Cursor Rules配置实战与团队协作指南

1. 项目概述:从“Cursor Rules”看现代开发者的效率革命最近在GitHub上看到一个名为usrrname/cursorrules的项目,这个标题乍一看有点意思,它直接点明了两个核心要素:cursor和rules。对于深度使用Cursor这款AI代码编辑器的开发者来…...

如何用python函数制作一个计算工具

大家好,这里是junlang的python文章 今天教大家如何用python函数做一个计算器,希望大家好好学习哦 如何制作 首先我们先定义4个函数,其中除法计算代码请看下面: def add (a,b,c):return (a b - c) def sub (x,y):return(x - y) def mulpl…...

星露谷物语模组加载器SMAPI:免费开源的游戏增强终极指南

星露谷物语模组加载器SMAPI:免费开源的游戏增强终极指南 【免费下载链接】SMAPI The modding API for Stardew Valley. 项目地址: https://gitcode.com/gh_mirrors/smap/SMAPI 星露谷物语模组加载器SMAPI是《星露谷物语》的官方模组API,为这款经典…...

DSP架构设计与低功耗优化关键技术解析

1. DSP架构基础与性能挑战数字信号处理器(DSP)与传统微控制器在架构设计上存在本质差异。微控制器主要面向控制任务——处理输入数据、做出决策并调整输出设备状态,而DSP的核心使命是维持连续数据流的高效处理。这种差异直接体现在硬件架构的…...

AI API智能调度中继服务:多账号管理与高可用架构实践

1. 项目概述:一个高性能的AI API智能调度中转站如果你手头有多个Claude、Gemini或者OpenAI的账号,并且经常在不同的开发工具(比如Claude Code CLI、各种SDK)之间切换使用,那你肯定体会过那种管理上的繁琐。每次调用都得…...

量子度量学习的黑盒验证协议设计与实现

1. 量子度量学习与黑盒验证概述量子度量学习(Quantum Metric Learning)是量子机器学习领域的一个重要分支,其核心目标是通过优化量子特征映射,将经典数据转换为量子希尔伯特空间中的态,使得不同类别的数据在量子态空间…...

从零构建智能文档工厂:自动化生成API文档与多格式发布

1. 项目概述:从“文档生成”到“智能文档工厂”在软件开发和团队协作的日常里,文档工作常常被戏称为“脏活累活”。它不像写代码那样有即时的反馈和成就感,但又不可或缺。无论是API接口文档、项目说明、还是内部流程手册,一份清晰…...

微信聊天记录永久保存与深度分析:你的数字记忆守护者

微信聊天记录永久保存与深度分析:你的数字记忆守护者 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeChat…...

UCSC基因组浏览器可视化配置实战:从参数调优到多组学数据呈现

1. UCSC基因组浏览器入门:为什么选择它? 第一次接触UCSC基因组浏览器是在分析RNA-seq数据时,当时需要直观展示基因表达差异。这个由加州大学圣克鲁兹分校维护的工具,已经成为生物信息学领域的标准配置。它最吸引我的特点是零代码…...

在 Python 中使用 comtypes 时,大小写通常必须保持精确

wb excel.Workbooks.Open(file_path)print(f"文件已打开: {file_path}")后面的方法,大小写可以写错吗?这是一个非常经典的问题,答案是:在 Python 中使用 comtypes 时,大小写通常必须保持精确,不…...

SingleFile:一站式网页归档解决方案,让网页永久保存不再是难题

SingleFile:一站式网页归档解决方案,让网页永久保存不再是难题 【免费下载链接】SingleFile Web Extension for saving a faithful copy of a complete web page in a single HTML file 项目地址: https://gitcode.com/gh_mirrors/si/SingleFile …...

Ironclaw:基于Rust的现代化命令行工具集,重塑开发效率

1. 项目概述:一个面向开发者的现代化命令行工具集在当今的软件开发工作流中,命令行界面(CLI)依然是开发者与系统、服务交互的核心桥梁。无论是进行本地开发、自动化部署、系统运维还是数据处理,一个高效、可靠、符合直…...

卫星热真空测试中射频功率测量的关键技术突破

1. 卫星热真空测试中的射频功率测量挑战在卫星研制过程中&#xff0c;热真空测试&#xff08;TVAC&#xff09;是验证航天器能否承受太空极端环境的关键环节。测试环境需要模拟太空中的高真空&#xff08;<510⁻⁶ Torr&#xff09;和极端温度&#xff08;-196℃至140℃&…...

Claw Mentor:为OpenClaw智能体实现自动化配置同步与社区化演进

1. 项目概述&#xff1a;为你的AI智能体引入“导师”机制在AI智能体&#xff08;Agent&#xff09;开发领域&#xff0c;尤其是基于OpenClaw这类开源框架时&#xff0c;我们常常面临一个困境&#xff1a;如何持续地学习和迭代&#xff0c;跟上领域内最佳实践的发展速度&#xf…...