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

SQL语句---特殊查询

文章目录

  • SQL语句---特殊查询
    • 1、行列转换
      • 1.1 行转列
        • 1.1.1 统计每个人的各科分数及总分
        • 1.1.2 统计各门课程的数据
      • 1.2 列转行
        • 1.2.1 查询每个人的工资流水
    • 2、按月统计

SQL语句—特殊查询

1、行列转换

1.1 行转列

有如下score表

在这里插入图片描述

1.1.1 统计每个人的各科分数及总分

编写SQL语句,得到如下结果:

在这里插入图片描述
使用CASE

select 
	student,
	max(CASE WHEN subject = 'Java' THEN score END) as Java,
	max(CASE WHEN subject = 'MySQL' THEN score END) as MySQL,
	max(CASE WHEN subject = 'HTML' THEN score END) as HTML,
	sum(score) as Total
from score
GROUP BY student

使用子查询

select student, 
	(select score from score s1 where s1.student = s.student and subject = 'Java') as Java,
	(select score from score s1 where s1.student = s.student and subject = 'MySQL') as MySQL,
	(select score from score s1 where s1.student = s.student and subject = 'HTML') as HTML,
	sum(score) as Total
from score s
group by student

1.1.2 统计各门课程的数据

查询各门课程的最高分,最低分,平均分,及格率,不及格率,如下表:

在这里插入图片描述
使用子查询

对于最高分、最低分、平均分,只需要使用聚合函数即可。

但及格率和不及格率计算很不方便,这里使用case生成两个辅助列。

select subject,
	max(score) as 最高分, 
	min(score) as 最低分, 
	avg(score) as 平均分, 
	sum(及格)/count(id) as 及格率, 
	sum(不及格)/count(id) as 不及格率
from (
	select *,
		case when score>=60 then 1 else 0 end as 及格,
		case when score<60 then 1 else 0 end as 不及格
	from score
) as s
group by subject

1.2 列转行

有如下表:

在这里插入图片描述

1.2.1 查询每个人的工资流水

编写SQL语句,得到如下结果:

在这里插入图片描述
使用UNION拼接

select name, 'Jan' as month, Jan
from salary 
union
select name, 'Feb' as month, Feb
from salary 
union
select name, 'Mar' as month, Mar
from salary 
order by name desc

2、按月统计

数据表

有如下order表:

在这里插入图片描述
统计每个月的总销售额

编写SQL语句,得到如下结果:

在这里插入图片描述
每月都有数据

直接根据月份进行分组,不需要额外生成月份。

select 
	DATE_FORMAT(time,'%Y-%m') as 月份, 
	count(id) 订单数,
	sum(count) 销售量,
	sum(count*salary) 销售额
from `order`
group by year(time), month(time)
order by time

有的月份没有数据

需要额外生成月份,再进行连接查询。

查询过去12个月,每月的销售额,如当前日期是2023/08/08,则查询2022/08~2022/09十二个月的数据。

可利用如下代码生成12个月的信息:

select LAST_DAY(SUBDATE(CURDATE(),INTERVAL 1 MONTH)) as m UNION
select LAST_DAY(SUBDATE(CURDATE(),INTERVAL 2 MONTH)) UNION
select LAST_DAY(SUBDATE(CURDATE(),INTERVAL 3 MONTH)) UNION
select LAST_DAY(SUBDATE(CURDATE(),INTERVAL 4 MONTH)) UNION
select LAST_DAY(SUBDATE(CURDATE(),INTERVAL 5 MONTH)) UNION
select LAST_DAY(SUBDATE(CURDATE(),INTERVAL 6 MONTH)) UNION
select LAST_DAY(SUBDATE(CURDATE(),INTERVAL 7 MONTH)) UNION
select LAST_DAY(SUBDATE(CURDATE(),INTERVAL 8 MONTH)) UNION
select LAST_DAY(SUBDATE(CURDATE(),INTERVAL 9 MONTH)) UNION
select LAST_DAY(SUBDATE(CURDATE(),INTERVAL 10 MONTH)) UNION
select LAST_DAY(SUBDATE(CURDATE(),INTERVAL 11 MONTH)) UNION
select LAST_DAY(SUBDATE(CURDATE(),INTERVAL 12 MONTH))

将得到如下结果:

在这里插入图片描述
再与order表进行连接查询。

select 
	DATE_FORMAT(m,'%Y-%m') as 月份, 
	COUNT(id) 订单数,
	IFNULL(SUM(count), 0) 销售量,
	IFNULL(SUM(count*salary), 0) 销售额
from (
	select LAST_DAY(SUBDATE(CURDATE(),INTERVAL 1 MONTH)) as m UNION
	select LAST_DAY(SUBDATE(CURDATE(),INTERVAL 2 MONTH)) UNION
	select LAST_DAY(SUBDATE(CURDATE(),INTERVAL 3 MONTH)) UNION
	select LAST_DAY(SUBDATE(CURDATE(),INTERVAL 4 MONTH)) UNION
	select LAST_DAY(SUBDATE(CURDATE(),INTERVAL 5 MONTH)) UNION
	select LAST_DAY(SUBDATE(CURDATE(),INTERVAL 6 MONTH)) UNION
	select LAST_DAY(SUBDATE(CURDATE(),INTERVAL 7 MONTH)) UNION
	select LAST_DAY(SUBDATE(CURDATE(),INTERVAL 8 MONTH)) UNION
	select LAST_DAY(SUBDATE(CURDATE(),INTERVAL 9 MONTH)) UNION
	select LAST_DAY(SUBDATE(CURDATE(),INTERVAL 10 MONTH)) UNION
	select LAST_DAY(SUBDATE(CURDATE(),INTERVAL 11 MONTH)) UNION
	select LAST_DAY(SUBDATE(CURDATE(),INTERVAL 12 MONTH))
) as month
left join `order` on year(time) = year(m) and month(time) = month(m)
group by m

http://www.dtcms.com/a/92666.html

相关文章:

  • 递归,搜索,回溯算法(一)
  • 多版本PHP开发环境配置教程:WAMPServer下MySQL/Apache/MariaDB版本安装与切换
  • ubuntu下docker 安装 graylog 6.1
  • HTML输出流
  • WebMvcConfigurer 的 addResourceLocations
  • Eplan许可管理的自动化工具
  • [Vue2]指令修饰符(一)
  • [问题收集]mysql主从分离过程中,数据不同步可能导致的后果以及应对策略
  • NFC 智能门锁全栈解决方案:移动端、服务器、Web 管理平台
  • src案例分享-逻辑漏洞
  • 软路由用联想j3710主板踩坑
  • 从0到1,解锁Ant Design X的无限可能
  • 能源革命新突破:虚拟电厂赋能微电网智能调控,构建低碳生态新格局
  • MCP插件使用(browser-tools-mcp为例)
  • 通过一个led点灯的demo来熟悉openharmony驱动编写的过程(附带hdf详细调用过程)
  • 【windows搭建lvgl模拟环境之VSCode】
  • Vue3项目中的.vscode文件夹
  • kettle插件-dm达梦数人大金仓Vastbase数据库插件
  • 硬件基础--05_电压
  • RAG优化:Python从零实现分层索引Hierarchy黑科技拯救迷失的文本碎片
  • 寻找力量
  • 算法-动态规划三
  • 123网盘突破限制
  • 针对stm32F103C8t6芯片调节USB串口的经验
  • Webview详解(下)
  • 深入理解操作系统基础文件I/O:从系统调用到底层实现
  • 观察者模式(Observer Pattern)
  • 走进国际数字影像产业园,享受一站式优质服务
  • 自研工具分享:多媒体文件分配2.0 PaddleOCR成功打包exe
  • React-nodejs 练习 个人博客