当前位置: 首页 > 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

相关文章:

  • 递归,搜索,回溯算法(一)
  • 多版本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黑科技拯救迷失的文本碎片
  • 一周观展|上海浦东美术馆透纳展还剩最后5天
  • 习近平将对俄罗斯进行国事访问并出席纪念苏联伟大卫国战争胜利80周年庆典
  • 大众、学术和政治三重框架下的“汉末之变”
  • 著名医学翻译家王贤才逝世,享年91岁
  • 2024年境内酒店住宿行业指标同比下滑:酒店行业传统增长模式面临挑战
  • 426.8万人次!长三角铁路创单日客发量历史新高