IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 详解MySQL行转列、数据汇总、拼接和相关测试 -> 正文阅读

[大数据]详解MySQL行转列、数据汇总、拼接和相关测试

1 缘起

补习MySQL基础函数应用。
我的SQL应用太烂了,相对复杂的功能就要各种问和搜索,
先从基础的开始补习,
分享如下,文末附建表和添加数据。

2 原始数据

在这里插入图片描述

3 行转列

将subject转为按列显示,效果如下图所示。
在这里插入图片描述

思路:
(1)提取出subject列,按username为科目列取score列的值。
(2)将相同username的行求和,获取每个username的subject分数(score)。
(3)最后按照username分组。

3.1 使用CASE

SELECT username,
SUM(CASE subject WHEN '科目一' THEN score ELSE 0 END) AS '科目一',
SUM(CASE subject WHEN '科目二' THEN score ELSE 0 END) AS '科目二',
SUM(CASE subject WHEN '科目三' THEN score ELSE 0 END) AS '科目三',
SUM(CASE subject WHEN '科目四' THEN score ELSE 0 END) AS '科目四'
FROM db_monkey_run.tb_user_score
GROUP BY username;

3.2 使用IF

SELECT username,
SUM(IF(subject='科目一', score, 0)) AS '科目一',
SUM(IF(subject='科目二', score, 0)) AS '科目二',
SUM(IF(subject='科目三', score, 0)) AS '科目三',
SUM(IF(subject='科目四', score, 0)) AS '科目四'
FROM db_monkey_run.tb_user_score
GROUP BY username;

4 汇总数据

4.1 使用SUM

  • IF行转列,SUM汇总
SELECT username,
SUM(IF(subject='科目一', score, 0)) AS '科目一',
SUM(IF(subject='科目二', score, 0)) AS '科目二',
SUM(IF(subject='科目三', score, 0)) AS '科目三',
SUM(IF(subject='科目四', score, 0)) AS '科目四',
SUM(score) AS total
FROM db_monkey_run.tb_user_score
GROUP BY username
ORDER BY total DESC;
  • CASE行转列,SUM汇总
-- 行转列,汇总
SELECT username,
SUM(CASE subject WHEN '科目一' THEN score ELSE 0 END) AS '科目一',
SUM(CASE subject WHEN '科目二' THEN score ELSE 0 END) AS '科目二',
SUM(CASE subject WHEN '科目三' THEN score ELSE 0 END) AS '科目三',
SUM(CASE subject WHEN '科目四' THEN score ELSE 0 END) AS '科目四',
SUM(score) AS total
FROM db_monkey_run.tb_user_score
GROUP BY username
ORDER BY total DESC;

在这里插入图片描述

4.2 使用WITH ROLLUP

步骤:
(1)子查询:计算每个username各个subject的总和。
(2)行转列:计算每个username同一个subject的总和。

SELECT IFNULL(username, 'total') AS username,
SUM(IF(subject='科目一', score, 0)) AS '科目一',
SUM(IF(subject='科目二', score, 0)) AS '科目二',
SUM(IF(subject='科目三', score, 0)) AS '科目三',
SUM(IF(subject='科目四', score, 0)) AS '科目四',
SUM(IF(subject='total', score, 0)) AS total
FROM(
SELECT username, IFNULL(subject, 'total') AS subject, SUM(score) AS score 
FROM db_monkey_run.tb_user_score 
GROUP BY username, subject
WITH ROLLUP
HAVING username IS NOT NULL
) AS A
GROUP BY username
WITH ROLLUP;

在这里插入图片描述

5 数据拼接

SELECT username, GROUP_CONCAT(subject, ':', score) AS score 
FROM db_monkey_run.tb_user_score
GROUP BY username;

在这里插入图片描述

6 小结

(1)行转列两种方案:CASE和IF;
(2)汇总两种方案:SUM和WITH ROLLUP;
(3)拼接:GROUP_CONCAT。


7 函数使用

7.1 IF

格式:
IF(exp, v1, v2)
如果exp为true,使用v1替换,exp为false,使用v2替换。

序号参数描述
1exp表达式
2v1表达式为true时赋予的值
3v2表达式为false时赋予的值
SELECT id, user_id, IF(sex IS NULL, 'UNKNOWN', sex) AS sex FROM db_monkey_run.tb_user;

在这里插入图片描述

7.2 IFNULL

格式:
IFNULL(v1,v2)
如果v1值为NULL,使用v2替换NULL。

序号参数描述
1v1查询的值,如果为NULL,使用v2
2v2替换NULL的值
SELECT id, user_id, IFNULL(sex, 'UNKNOWN') AS sex FROM db_monkey_run.tb_user;

在这里插入图片描述

7.3 CASE

格式:
CASE column
WHEN v1 THEN v2
ELSE v3
END
如果column值为v1,使用v2替换,否则使用v3替换。

SELECT 
    id,
    user_id,
    CASE sex
        WHEN 'male' THEN '男'
        WHEN 'female' THEN '女'
        ELSE 'UNKNOWN'
    END AS sex
FROM
    db_monkey_run.tb_user;

在这里插入图片描述

7.4 DISTINCT

合并相同数据值,NULL也作为一种数据。

SELECT DISTINCT sex FROM db_monkey_run.tb_user;

由结果可知,将sex列合并后的结果有三种值:male、female和NULL。
在这里插入图片描述
结合COUNT使用时,会自动排除NULL值。

SELECT COUNT(DISTINCT sex) AS sex_num FROM db_monkey_run.tb_user;

在这里插入图片描述
多个字段同时会被过滤,即DISTINCT不会单独区分过滤的字段,会针对所有字段进行过滤。

SELECT DISTINCT username,sex FROM db_monkey_run.tb_user;

在这里插入图片描述

附件

创建表

CREATE TABLE `db_monkey_run`.`tb_user_score` (
  `id` INT NOT NULL AUTO_INCREMENT COMMENT '主键',
  `userid` VARCHAR(45) NULL COMMENT '用户id',
  `username` VARCHAR(45) NULL COMMENT '用户姓名',
  `subject` VARCHAR(45) NULL COMMENT '科目',
  `score` DOUBLE NULL COMMENT '分数',
  PRIMARY KEY (`id`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf32
COMMENT = '用户各科目得分';

添加数据

INSERT INTO db_monkey_run.tb_user_score(userid,username,subject,score) VALUES ('0x001','xiaoyi','科目一',91);
INSERT INTO db_monkey_run.tb_user_score(userid,username,subject,score) VALUES ('0x001','xiaoyi','科目二',95);
INSERT INTO db_monkey_run.tb_user_score(userid,username,subject,score) VALUES ('0x001','xiaoyi','科目三',77);
INSERT INTO db_monkey_run.tb_user_score(userid,username,subject,score) VALUES ('0x002','xiaoer','科目一',67);
INSERT INTO db_monkey_run.tb_user_score(userid,username,subject,score) VALUES ('0x002','xiaoer','科目二',89);
INSERT INTO db_monkey_run.tb_user_score(userid,username,subject,score) VALUES ('0x002','xiaoer','科目三',89);
INSERT INTO db_monkey_run.tb_user_score(userid,username,subject,score) VALUES ('0x003','xiaosan','科目一',66);
INSERT INTO db_monkey_run.tb_user_score(userid,username,subject,score) VALUES ('0x003','xiaosan','科目二',98);
INSERT INTO db_monkey_run.tb_user_score(userid,username,subject,score) VALUES ('0x003','xiaosan','科目三',76);
INSERT INTO db_monkey_run.tb_user_score(userid,username,subject,score) VALUES ('0x003','xiaosan','科目四',79);
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-06-21 21:28:50  更:2022-06-21 21:29:13 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 0:18:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码