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

Mysql 行转列,列转行

1,创建表初始化数据

CREATE TABLE `StudentScores` ( `UserName` varchar(20) DEFAULT NULL, `Subject` varchar(30) DEFAULT NULL, `Score` float DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO StudentScores SELECT 'Nick', '语文', 80; INSERT INTO StudentScores SELECT 'Nick', '数学', 90; INSERT INTO StudentScores SELECT 'Nick', '英语', 70; INSERT INTO StudentScores SELECT 'Nick', '生物', 85; INSERT INTO StudentScores SELECT 'Kent', '语文', 80; INSERT INTO StudentScores SELECT 'Kent', '数学', 90; INSERT INTO StudentScores SELECT 'Kent', '英语', 70; INSERT INTO StudentScores SELECT 'Kent', '生物', 85;

2,查询行转列


如果我想知道每位学生的每科成绩,而且每个学生的全部成绩排成一行,这样方便我查看、统计,导出数据

SELECT UserName, MAX(CASE Subject WHEN '语文' THEN Score ELSE 0 END) AS '语文', MAX(CASE Subject WHEN '数学' THEN Score ELSE 0 END) AS '数学', MAX(CASE Subject WHEN '英语' THEN Score ELSE 0 END) AS '英语', MAX(CASE Subject WHEN '生物' THEN Score ELSE 0 END) AS '生物' FROM StudentScores GROUP BY UserName


查询结果如图所示,这样我们就能很清楚的了解每位学生所有的成绩了

CREATE TABLE Inpours ( ID INT , UserName NVARCHAR(20), --游戏玩家 CreateTime DATETIME, --充值时间 PayType NVARCHAR(20), --充值类型 Money DECIMAL, --充值金额 IsSuccess BIT, --是否成功 1表示成功, 0表示失败 CONSTRAINT PK_Inpours_ID PRIMARY KEY(ID) ) CREATE TABLE `Inpours` ( `ID` INT(10) NOT NULL AUTO_INCREMENT, `UserName` VARCHAR(20) DEFAULT NULL, `CreateTime` DATETIME, `PayType` VARCHAR(20) DEFAULT NULL, `Money` DECIMAL, `IsSuccess` BIT, CONSTRAINT PK_Inpours_ID PRIMARY KEY (`ID`) ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; INSERT INTO Inpours SELECT '1','张三', '2010-05-01', '支付宝', 50, 1; INSERT INTO Inpours SELECT '2','张三', '2010-06-14', '支付宝', 50, 1; INSERT INTO Inpours SELECT '3','张三', '2010-06-14', '手机短信', 100, 1; INSERT INTO Inpours SELECT '4','李四', '2010-06-14', '手机短信', 100, 1; INSERT INTO Inpours SELECT '5','李四', '2010-07-14', '支付宝', 100, 1; INSERT INTO Inpours SELECT '6','王五', '2010-07-14', '工商银行卡', 100, 1; INSERT INTO Inpours SELECT '7','赵六', '2010-07-14', '建设银行卡', 100, 1;

下面来了一个统计数据的需求,要求按日期、支付方式来统计充值金额信息。这也是一个典型的行转列的例子。我们可以通过下面的脚本来达到目的

SELECT CreateTime, (CASE PayType WHEN '支付宝' THEN SUM(Money) ELSE 0 END) AS '支付宝', (CASE PayType WHEN '手机短信' THEN SUM(Money) ELSE 0 END) AS '手机短信', (CASE PayType WHEN '工商银行卡' THEN SUM(Money) ELSE 0 END) AS '工商银行卡', (CASE PayType WHEN '建设银行卡' THEN SUM(Money) ELSE 0 END) AS '建设银行卡' FROM Inpours GROUP BY CreateTime,PayType

其实行转列,关键是要理清逻辑,而且对分组(Group by)概念比较清晰。

3、列转行

CREATE TABLE `TEST_TB_GRADE2` ( `ID` int(10) NOT NULL AUTO_INCREMENT, `USER_NAME` varchar(20) DEFAULT NULL, `CN_SCORE` float DEFAULT NULL, `MATH_SCORE` float DEFAULT NULL, `EN_SCORE` float DEFAULT '0', PRIMARY KEY (`ID`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; insert into TEST_TB_GRADE2(USER_NAME, CN_SCORE, MATH_SCORE, EN_SCORE) values ("张三", 34, 58, 58), ("李四", 45, 87, 45), ("王五", 76, 34, 89); select user_name, '语文' COURSE , CN_SCORE as SCORE from TEST_TB_GRADE2 union select user_name, '数学' COURSE, MATH_SCORE as SCORE from TEST_TB_GRADE2 union select user_name, '英语' COURSE, EN_SCORE as SCORE from TEST_TB_GRADE2 order by user_name,COURSE;


http://www.jsqmd.com/news/1198873/

相关文章:

  • Python + Selenium + WebDriver:从零构建企业级UI自动化测试框架(实战指南)
  • JAVA练习290- 相交链表
  • PCB阻抗与损耗控制:高速设计中的信号完整性关键
  • Shiro反序列化漏洞深度解析:从原理到攻防实战
  • STM8S ADC2通道干扰分析与优化方案
  • C++ Lambda表达式深度解析:从基础语法到高级应用实战
  • OpenStack Nova服务端手动安装与配置指南
  • 大三必考的5类高含金量IT证书
  • 如何快速解锁AO3镜像站:三步轻松访问全球同人创作宝库
  • MATLAB实现指纹图像增强、细化与端点分叉点坐标提取(含示例图和可运行脚本)
  • C++原子操作std::atomic详解:从原理到无锁队列实战
  • CodeGraph+Trae+Cursor:构建代码语义知识图谱的实战指南
  • C++协程栈内存监控:从原理到实践的防御性编程方案
  • C++异步日志库Quill:高并发场景下的高性能日志解决方案
  • TRAE:VS2022编译错误自动修复工具
  • RK3399Pro开发板USB摄像头配置与AI加速实践
  • 从AGM到BigCLAM:基于非负矩阵分解的重叠社区发现算法演进与实践
  • 【电力电子仿真进阶】Cuk变换器V²控制建模与瞬态性能Simulink分析
  • 圣装刺剑Prime强度解析:近战武器生态位与配卡实战指南
  • Masstree调试与故障排除:常见问题解决与性能优化清单
  • Unity NativeArray源码解析:内存管理、线程安全与Job System协同
  • 从零开始学习信号完整性--10-电平标准(3):CML与LVDS的互连实战与选型指南
  • C++核心概念与实战技巧精讲(2024版)
  • CAN矩阵实战指南:从DBC文件到ECU信号解析(全链路解析)
  • RePKG:Wallpaper Engine资源逆向工程的完整解决方案
  • 自动驾驶C++工程化实战:从代码规范到设计模式的四大基石
  • C#实现Windows文件占用检测:基于句柄枚举定位锁定进程
  • C语言指针完全指南:从内存管理到动态分配实战
  • C++ STL vector模拟实现:从内存管理到迭代器失效的深度解析
  • JetBrains IDE试用期重置终极指南:免费获得无限评估时间