MySQL行转列列转行实例解析

news2024/11/17 9:58:33

文档准备

要求:找出所有的用户没有安装的软件。

创建两个表,用户表app_install app表app

建表语句:

# 创建app表,并插入数据
create table app(id int,app varchar(32));
insert into app(id,app) values (1,'微信'),(2,'QQ'),(3,'支付宝'),(4,'京东'),(5,'拼多多'),(6,'王者'),(7,'小红书');

# 创建用户表,并插入数据
create table app_install(uid int,app varchar(32));
insert into app_install(uid, app) values (1,'微信'),(1,'QQ'),(1,'支付宝'),(1,'京东'),(2,'微信'),(2,'平多多'),(3,'王者'),(3,'QQ'),(3,'支付宝');

app表:

app_install表:

列转行

第一步:要求统计所有用户没有安装的软件,那么我们首先就需要知道所有用户安装的软件。

select
       uid,
       case when app='微信' then 1 else 0 end as '微信',
       case when app='QQ' then 1 else 0 end as 'QQ',
       case when app='支付宝' then 1 else 0 end as '支付宝',
       case when app='京东' then 1 else 0 end as '京东',
       case when app='拼多多' then 1 else 0 end as '拼多多',
       case when app='王者' then 1 else 0 end as '王者',
       case when app='小红书' then 1 else 0 end as '小红书'
from app_install

第二步:上面这个表得到的行是重复的,每一行只有一条数据。我们需要按照用户将app进行相加。

select tb2.uid,max(微信) '微信',max(QQ) 'QQ',max(支付宝) '支付宝',max(京东) '京东',max(拼多多) '拼多多',max(王者) '王者',max(小红书) '小红书'
from
(select
       uid,
       case when app='微信' then 1 else 0 end as '微信',
       case when app='QQ' then 1 else 0 end as 'QQ',
       case when app='支付宝' then 1 else 0 end as '支付宝',
       case when app='京东' then 1 else 0 end as '京东',
       case when app='拼多多' then 1 else 0 end as '拼多多',
       case when app='王者' then 1 else 0 end as '王者',
       case when app='小红书' then 1 else 0 end as '小红书'
from app_install) tb2 group by uid

注1:第一步的表作为一个整体需要起别名(tb2)

注2:这里的max和sum没有本质的区别,都可以使用

第三步:将0和1转换成文字,同样使用case when...then...else...end as...

select tb1.uid,
       case when 微信=1 then '已安装' else '未安装' end as '微信',
       case when QQ=1 then '已安装' else '未安装' end as 'QQ',
       case when 支付宝=1 then '已安装' else '未安装' end as '支付宝',
       case when 京东=1 then '已安装' else '未安装' end as '京东',
       case when 拼多多=1 then '已安装' else '未安装' end as '拼多多',
       case when 王者=1 then '已安装' else '未安装' end as '王者',
       case when 小红书=1 then '已安装' else '未安装' end as '小红书'
       from
(select tb2.uid uid,max(微信) '微信',max(QQ) 'QQ',max(支付宝) '支付宝',max(京东) '京东',max(拼多多) '拼多多',max(王者) '王者',max(小红书) '小红书'
from
(select
       uid,
       case when app='微信' then 1 else 0 end as '微信',
       case when app='QQ' then 1 else 0 end as 'QQ',
       case when app='支付宝' then 1 else 0 end as '支付宝',
       case when app='京东' then 1 else 0 end as '京东',
       case when app='拼多多' then 1 else 0 end as '拼多多',
       case when app='王者' then 1 else 0 end as '王者',
       case when app='小红书' then 1 else 0 end as '小红书'
from app_install) tb2 group by uid) tb1

第四步:统计app的安装率。在第二步的基础上进行升级

select
       '安装率',
    sum(微信)/count(微信) 微信,
    sum(QQ)/count(QQ) QQ,
    sum(支付宝)/count(支付宝) 支付宝,
    sum(京东)/count(京东) 京东,
    sum(拼多多)/count(拼多多) 拼多多,
    sum(王者)/count(王者) 王者,
    sum(小红书)/count(小红书) 小红书
from
(select max(微信) '微信',max(QQ) 'QQ',max(支付宝) '支付宝',max(京东) '京东',max(拼多多) '拼多多',max(王者) '王者',max(小红书) '小红书'
from
(select
       uid,
       case when app='微信' then 1 else 0 end as '微信',
       case when app='QQ' then 1 else 0 end as 'QQ',
       case when app='支付宝' then 1 else 0 end as '支付宝',
       case when app='京东' then 1 else 0 end as '京东',
       case when app='拼多多' then 1 else 0 end as '拼多多',
       case when app='王者' then 1 else 0 end as '王者',
       case when app='小红书' then 1 else 0 end as '小红书'
from app_install) tb2 group by uid) tb1

如果想把这里的小数点变为xx.xx%的格式,将第三行改为如下:

concat(truncate(sum(微信)/count(微信)*100,2.4),'%') 微信

第五步:将第三步得到的表和第四步得到表进行合并

select tb.uid '用户',
       case when max(tb.微信)=1 then '已安装' else '未安装' end as '微信',
       case when max(tb.QQ)=1 then '已安装' else '未安装' end as 'QQ',
       case when max(tb.支付宝)=1 then '已安装' else '未安装' end as '支付宝',
       case when max(tb.京东)=1 then '已安装' else '未安装' end as '京东',
       case when max(tb.拼多多)=1 then '已安装' else '未安装' end as '拼多多',
       case when max(tb.王者)=1 then '已安装' else '未安装' end as '王者',
       case when max(tb.小红书)=1 then '已安装' else '未安装' end as '小红书'
from
(select
       uid,
       case when app='微信' then 1 else 0 end as '微信',
       case when app='QQ' then 1 else 0 end as 'QQ',
       case when app='支付宝' then 1 else 0 end as '支付宝',
       case when app='京东' then 1 else 0 end as '京东',
       case when app='拼多多' then 1 else 0 end as '拼多多',
       case when app='王者' then 1 else 0 end as '王者',
       case when app='小红书' then 1 else 0 end as '小红书'
from app_install ) tb group by tb.uid
union
select
       '安装率',concat(truncate(sum(微信)/count(微信)*100,2.4),'%') 微信,sum(QQ)/count(QQ) QQ,sum(支付宝)/count(支付宝) 支付宝,sum(京东)/count(京东) 京东,sum(拼多多)/count(拼多多) 拼多多,sum(王者)/count(王者) 王者,sum(小红书)/count(小红书) 小红书
from
(select max(微信) '微信',max(QQ) 'QQ',max(支付宝) '支付宝',max(京东) '京东',max(拼多多) '拼多多',max(王者) '王者',max(小红书) '小红书'
from
(select
       uid,
       case when app='微信' then 1 else 0 end as '微信',
       case when app='QQ' then 1 else 0 end as 'QQ',
       case when app='支付宝' then 1 else 0 end as '支付宝',
       case when app='京东' then 1 else 0 end as '京东',
       case when app='拼多多' then 1 else 0 end as '拼多多',
       case when app='王者' then 1 else 0 end as '王者',
       case when app='小红书' then 1 else 0 end as '小红书'
from app_install) tb2 group by uid) tb1;

列转行

第一步:由于在上面第三步的表中进行更改,于是将上面第三步的表创建视图

create view view_user2 as
select tb.uid '用户',
       case when max(tb.微信)=1 then '已安装' else '未安装' end as '微信',
       case when max(tb.QQ)=1 then '已安装' else '未安装' end as 'QQ',
       case when max(tb.支付宝)=1 then '已安装' else '未安装' end as '支付宝',
       case when max(tb.京东)=1 then '已安装' else '未安装' end as '京东',
       case when max(tb.拼多多)=1 then '已安装' else '未安装' end as '拼多多',
       case when max(tb.王者)=1 then '已安装' else '未安装' end as '王者',
       case when max(tb.小红书)=1 then '已安装' else '未安装' end as '小红书'
from
(select
       uid,
       case when app='微信' then 1 else 0 end as '微信',
       case when app='QQ' then 1 else 0 end as 'QQ',
       case when app='支付宝' then 1 else 0 end as '支付宝',
       case when app='京东' then 1 else 0 end as '京东',
       case when app='拼多多' then 1 else 0 end as '拼多多',
       case when app='王者' then 1 else 0 end as '王者',
       case when app='小红书' then 1 else 0 end as '小红书'
from app_install ) tb group by tb.uid;

第二步:啥也不说了,自己看吧

select u.用户,'微信' as 'app',微信 'status' from view_user2 u
union
select u.用户,'QQ' as 'app',QQ 'status' from view_user2 u
union
select u.用户,'支付宝' as 'app',支付宝 'status' from view_user2 u
union
select u.用户,'京东' as 'app',京东 'status' from view_user2 u
union
select u.用户,'拼多多' as 'app',拼多多 'status' from view_user2 u
union
select u.用户,'王者' as 'app',王者 'status' from view_user2 u
union
select u.用户,'小红书' as 'app',小红书 'status' from view_user2 u

第三步:按照用户id进行排序

select u.用户,'微信' as 'app',微信 'status' from view_user2 u
union
select u.用户,'QQ' as 'app',QQ 'status' from view_user2 u
union
select u.用户,'支付宝' as 'app',支付宝 'status' from view_user2 u
union
select u.用户,'京东' as 'app',京东 'status' from view_user2 u
union
select u.用户,'拼多多' as 'app',拼多多 'status' from view_user2 u
union
select u.用户,'王者' as 'app',王者 'status' from view_user2 u
union
select u.用户,'小红书' as 'app',小红书 'status' from view_user2 u
order by 用户 asc;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/354622.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

二叉树理论基础知识点

二叉树的种类 在我们解题过程中二叉树有两种主要的形式:满二叉树和完全二叉树 满二叉树 满二叉树:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。 如图所示: 这…

About Oracle Database Performance Method

bottleneck(瓶颈): a point where resource contention is highest throughput(吞吐量): the amount of work that can be completed in a specified time. response time (响应时间): the time to complete a spec…

Java 日志简介

目录1、Slf4j2、Log4j3、LogBack4、Logback 优点5、ELK1、Slf4j slf4j 的全称是 Simple Loging Facade For Java,即它仅仅是一个为 Java 程序提供日志输出的统一接口,并不是一个具体的日志实现方案,就比如 JDBC 一样,只是一种规则…

解决:eclipse绿化版Resource注解报Resource cannot be resolved to a type问题

如图: 网上解决教程很多,我的eclipse是绿化版的,不需要安装 解决办法如下: 1、在eclipse中,进入到Window->Preferences->Java->Installed JREs中 默认显示如下: 2、点击Add-->Standard VM--…

分页插件

引入依赖 注意需要和SpringBoot的版本对应&#xff0c;否则分页可能不生效 使用的分页依赖&#xff1a; <!-- pagehelper 插件--><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</arti…

Dockerfile详解及优化技巧

写在前面 Dockerfile的默认相对路径是Dockerfile所在的目录&#xff1b;Dockerfile中的每一行会被视为一层镜像 一、Dockerfile 原理 1.1 镜像定义 首先我们先来回顾一下 Docker 镜像&#xff0c;它由多个只读层堆叠到一起&#xff0c;每一层是上一层的增量修改。基于镜像创…

深度学习炼丹-数据标准化

前言 一般机器学习任务其工作流程可总结为如下所示 pipeline。 在工业界,数据预处理步骤对模型精度的提高的发挥着重要作用。对于机器学习任务来说,广泛的数据预处理一般有四个阶段(视觉任务一般只需 Data Transformation): 数据清洗(Data Cleaning)、数据整合(Data Integ…

【c语言进阶】深度剖析整形数据

&#x1f680;write in front&#x1f680; &#x1f4dc;所属专栏&#xff1a; &#x1f6f0;️博客主页&#xff1a;睿睿的博客主页 &#x1f6f0;️代码仓库&#xff1a;&#x1f389;VS2022_C语言仓库 &#x1f3a1;您的点赞、关注、收藏、评论&#xff0c;是对我最大的激励…

C++010-C++嵌套循环

文章目录C010-C嵌套循环嵌套循环嵌套循环举例题目描述 输出1的个数题目描述 输出n行99乘法表题目描述 求s1!2!...10!作业在线练习&#xff1a;总结C010-C嵌套循环 在线练习&#xff1a; http://noi.openjudge.cn/ https://www.luogu.com.cn/ 嵌套循环 循环可以指挥计算机重复去…

自命为缓存之王的Caffeine(6)

您好&#xff0c;我是湘王&#xff0c;这是我的CSDN博客&#xff0c;欢迎您来&#xff0c;欢迎您再来&#xff5e;之前用Caffeine替代Redis的时候&#xff0c;发现先保存KV&#xff0c;再获取key&#xff0c;过期时间为3秒。但即使过了3秒&#xff0c;还是能获取到保存的数据。…

网络爬虫简介

前言 没什么可以讲的所以就介绍爬虫吧 介绍 网络爬虫&#xff08;英语&#xff1a;web crawler&#xff09;&#xff0c;也叫网路蜘蛛&#xff08;spider&#xff09;&#xff0c;是一种用来自动浏览万维网的网络机器人。其目的一般为编纂网络索引。 网路搜索引擎等站点通过…

Windows 环境下,cmake工程导入OpenCV库

目录 1、下载 OpenCV 库 2、配置环境变量 3、CmakeLists.txt 配置 1、下载 OpenCV 库 OpenCV官方下载地址&#xff1a;download | OpenCV 4.6.0 下载完毕后解压&#xff0c;便可以得到下面的文件 2、配置环境变量 我们需要添加两个环境变量&#xff0c;一个是 OpenCVConfi…

小红书达人选择,投放指南4注意!

为什么达人投放后反响平平&#xff0c;别的品牌为什么曝光这么高&#xff0c;我投放的钱是打水漂了吗&#xff1f;怎么能达到高曝光投放&#xff1f;今天就跟大家来聊聊如何让小红书达人投放达到高曝光&#xff1f;随着消费升级&#xff0c;在这场营销中&#xff0c;平台日渐爆…

数据结构与算法】链表2:节点交换与删除 链表相交 环形链表

文章目录今日任务1.Leetcode24&#xff1a;两两交换链表中的节点&#xff08;1&#xff09;题目&#xff08;2&#xff09;思路&#xff08;3&#xff09;代码实现2.Leetcode19&#xff1a;删除链表的倒数第N个节点&#xff08;1&#xff09;题目&#xff08;2&#xff09;思路…

机试_6_数据结构(二)

本文介绍机试中考查的一些非线性数据结构&#xff0c;包括二叉树、二叉排序树、优先队列和散列表等较为高级的数据结构。 一、二叉树 树的结构有诸多变体&#xff0c;它们在各种应用中发挥着重要作用。 作为树的特例的二叉树(Binary Tree)&#xff0c;虽然看似简单&#xff0…

Ubuntu安装boost库

参考链接&#xff1a;https://blog.csdn.net/zeye5731/article/details/122413193 1、下载 boost库 boost 库各大版本下载&#xff1a;boost download | hisroy versions 下面就以安装 1.78.0的版本为例 2、安装boost库 我们将下载好的boost库上传到Ubuntu&#xff0c;并解…

C++设计模式(16)——责任链模式

亦称&#xff1a; 职责链模式、命令链、CoR、Chain of Command、Chain of Responsibility 意图 责任链模式是一种行为设计模式&#xff0c; 允许你将请求沿着处理者链进行发送。 收到请求后&#xff0c; 每个处理者均可对请求进行处理&#xff0c; 或将其传递给链上的下个处理…

关闭终端后在服务器上运行代码+将终端输出打印到文件中

解决方案 首先打开一个screen # name是你想给你的项目在screen中起的名字 screen -S name 然后&#xff0c;在你的运行命令后加入 | tee xxxx.txt&#xff0c;如 python run_mujoco.py --envWalker2d-v2 --tradeoff0.2 | tee Walker2d-v2.txt 这样就可以实现题目中的目的了…

华测导航GPCHC协议ROS驱动包,CGI610、410接收机,NavSatStatus、GPSFix和普通格式

目录一、消息类型1.1 sensor_msgs/NavSatFix1.2 sensor_msgs/NavSatStatus1.3 gps_common::GPSFix1.4 sensor_msgs::Imu二、部分源码2.1 相关的依赖和库2.2 文件结构2.3 字段分割函数2.4 定义消息话题Ubuntu 20.04 noetic 华测CGI 610——RS232-C——GPCHC 一、消息类型 1.1 …

从零编写linux0.11 - 第十一章 可执行文件

从零编写linux0.11 - 第十一章 可执行文件 编程环境&#xff1a;Ubuntu 20.04、gcc-9.4.0 代码仓库&#xff1a;https://gitee.com/AprilSloan/linux0.11-project linux0.11源码下载&#xff08;不能直接编译&#xff0c;需进行修改&#xff09; 本章目标 本章会加载并运行…