首页 > 数据库 >mysql行列互转

mysql行列互转

时间:2023-01-31 00:11:25浏览次数:41  
标签:count GROUP dept -- 行列 user mysql 互转 SELECT

1.构造常量表

SELECT '优' as label, 'A' as `value`
UNION ALL
SELECT '中' as label, 'B' as `value`
UNION ALL
SELECT '良' as label, 'C' as `value`
UNION ALL
SELECT '差' as label, 'D' as `value`;

2.常量关联其他表(常量必有值)| 统计各成绩人数

用户表

/*
 Navicat Premium Data Transfer

 Source Server         : java505
 Source Server Type    : MySQL
 Source Server Version : 80022
 Source Host           : localhost:3306
 Source Schema         : bise

 Target Server Type    : MySQL
 Target Server Version : 80022
 File Encoding         : 65001

 Date: 31/01/2023 00:03:47
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `id` int(0) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `dept` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `sex` tinyint(0) NOT NULL,
  `grade` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (1, '张三', '人事部', 1, 'A');
INSERT INTO `user` VALUES (2, '李四', '人事部', 1, 'B');
INSERT INTO `user` VALUES (3, '王五', '测试部', 2, 'C');
INSERT INTO `user` VALUES (4, '赵六', '测试部', 2, '');
INSERT INTO `user` VALUES (5, '田七', '技术部', 2, 'A');

SET FOREIGN_KEY_CHECKS = 1;

SELECT * FROM user;

WITH temp as (
	SELECT '优' as label, 'A' as `value`
	UNION
	SELECT '中' as label, 'B' as `value`
	UNION
	SELECT '良' as label, 'C' as `value`
	UNION
	SELECT '差' as label, 'D' as `value`
),w1 as (
	SELECT grade,count(id)`count` FROM user GROUP BY `grade`
)

SELECT 
temp.*,
IFNULL(w1.count,0) `count` -- 没有值取0
FROM temp LEFT JOIN w1 ON w1.grade = temp.`value`;

3.行转列 统计部门人数(将行转列,需要知道多少行,当不知道多少行时可以与1常量表关联构造)

3.1 转一行(一维,使用聚合函数String用group concat函数)

WITH w3 as (
	SELECT dept, count(id) `count` FROM user GROUP BY dept
)
-- 3.1 转一行(一维,使用聚合函数String用group concat函数)
	SELECT
  	sum(IF(dept='人事部',	`count`,0)) as rs,
	sum(IF(dept='测试部',	`count`,0)) as cs,
	sum(IF(dept='技术部',	`count`,0)) as js
 	FROM w3 ;

3.2 转一行(二维,使用聚合函数String用group concat函数)

WITH w3 as (
	SELECT dept, count(id) `count` FROM user GROUP BY dept
)
-- 3.2 转一行(二维,使用聚合函数String用group concat函数)
SELECT
GROUP_CONCAT(IF(dept='测试部',	`count`,0)) as rs,
GROUP_CONCAT(IF(dept='测试部',	`count`,0)) as cs,
GROUP_CONCAT(IF(dept='技术部',	`count`,0)) as js
FROM w3 ;

3.3 转n行(二维)

WITH w3 as (
	SELECT dept, count(id) `count` FROM user GROUP BY dept
)
-- 3.3 转n行(二维)
SELECT
 	sum(IF(dept='人事部',	`count`,0)) as rs,
	sum(IF(dept='测试部',	`count`,0)) as cs,
	sum(IF(dept='技术部',	`count`,0)) as js
FROM w3 GROUP BY dept ;

4.列转行(3.3 转 原始的w3)

-- 构造数据
with w4 as (
	WITH w3 as (
		SELECT dept, count(id) `count` FROM user GROUP BY dept
	)
	SELECT
		sum(IF(dept='人事部',	`count`,0)) as rs,
		sum(IF(dept='测试部',	`count`,0)) as cs,
		sum(IF(dept='技术部',	`count`,0)) as js
	FROM w3 GROUP BY dept
)
-- 转化
SELECT '人事部' as dept ,rs `count` FROM w4
UNION ALL
SELECT '测试部' as dept ,cs `count` FROM w4
UNION ALL
SELECT '技术部' as dept ,js `count` FROM w4

标签:count,GROUP,dept,--,行列,user,mysql,互转,SELECT
From: https://www.cnblogs.com/swz123/p/17077601.html

相关文章

  • mysql02
    mysqlday02课堂笔记1、把查询结果去除重复记录【distinct】 注意:原表数据不会被修改,只是查询结果去重。 去重需要使用一个关键字:distinct mysql>selectdistinctjobf......
  • mysql02
    mysqlday01课堂笔记1、什么是数据库?什么是数据库管理系统?什么是SQL?他们之间的关系是什么?数据库: 英文单词DataBase,简称DB。按照一定格式存储数据的一些文件的组合。 ......
  • 在linux下安装mysql8.0.22
    前提准备第一步:检查是否有安装过mysql命令:# rpm -qa|grep-Imysql,使用rpm方式进行验证,其中i表示忽略大小写 假如安装过了mysql则需要先卸载命令:# rpm -e--no......
  • MySQL基础-SQL-DDL
    1.SQL通用语法1.SQL语句可以单行或多行书写,以分号结尾。 2.SQL语句可以使用空格/缩进来增强语句的可读性。 3.MySQL数据库的SQL语句不区分大小写,关键......
  • MySql慢查询
    一、简介开启慢查询日志,可以让MySQL记录下查询超过指定时间的语句,通过定位分析性能的瓶颈,才能更好的优化数据库系统的性能。开发环境建议一直开启便与优化生成环境建议关......
  • MySql sql_mode
    sql_mode默认值是空值,在默认值设置下是可以允许一些非法操作,比如允许写入一些非法数据,在生产环境中,必须将sql_mode设置为严格模式mysql支持的sql_mode模式:ANSI、TRADITION......
  • mysql8.0远程访问配置
    mysql8.0远程访问配置一、修改bind-address查找配置文件my.confwhichmysql/usr/bin/mysql--verbose--help|grep-A1'Defaultoptions'vimy.cnfbind-addres......
  • 【Amadeus原创】MySQL8设置root用户远程访问
    1.查询当前root状态,默认root的host是localhostusemysql;selectuser,hostfromuser;2.updateroot的host为%updateusersethost='%'whereuser='root';3.检查客......
  • mysqldump 造成阻塞问题
    备份命令点击查看代码mysqldump-hxxxx-xxxx-P${PORT}-p${Pass}-R-e--triggers--master-data=2--single-transaction--set-gtid-purged=OFF--skip-add-drop......
  • centos7.9离线安装mysql5.7.40(本文使用initialize-insecure安装方法)
    centos7.9离线安装mysql5.7.40(本文使用initialize-insecure安装方法)一、卸载CentOS7系统自带mariadb#查看系统自带的Mariadb[root@NIWAY-190~]#rpm-qa|grepmariadbm......