使用查询让表格纵排变横排
在数据库查询的操作中,常常会见到,让纵向排列的数据变成横向排,这其中涉及到的知识点有聚合函数,分组及if函数等等.
大致思路可以分为:根据题目意思,先选择合适的列名进行分组;使用聚合函数来控制列数;if函数来控制条件,if(条件,条件为真的返回值,条件为假的返回值).
例子1
表内容:
2022-05-09 胜
2022-05-09 胜
2022-05-09 负
2022-05-09 负
2022-05-10 胜
2022-05-10 负
2022-05-10 负
如果要生成下列结果, 该如何写sql语句?
日期 胜 负
2005-22-09 2 2
2005-22-10 1 2
这道题就是统计在哪一天,胜了多少局,败了多少局,让日期作为分组条件,接着判断,如果`结果`为''胜",sum加1,同理,`负`也一样.
#建表
CREATE TABLE `tb_one`( `date` DATE NOT NULL, //日期 result CHAR(1) NOT NULL //结果 )
SELECT `date` 日期 ,SUM(IF(result='胜',1,0)) 胜 ,SUM(IF(result='负',1,0)) 负 FROM tb_one GROUP BY `date`;
例子2
year |
month |
amount |
2020 |
1 |
1.1 |
2020 |
2 |
1.2 |
2020 |
3 |
1.3 |
2020 |
4 |
1.1 |
2021 |
1 |
1.2 |
2021 |
2 |
1.3 |
2021 |
3 |
1.5 |
2021 |
4 |
1.2 |
查询结果如下
year |
m1 |
m2 |
m3 |
m4 |
2020 |
1.1 |
1.2 |
1.3 |
1.1 |
2021 |
1.2 |
1.3 |
1.5 |
1.2 |
请编写一条SQL语句实现上图的效果
可以看到,结果的第一行是别名,别名的语法: 列名 别名;或者 列名 AS 别名;
这道题是分别找出对应年份,对应月份的amount值,进行横排
SELECT `year`,SUM(IF(`month`=1,amount,0)) m1,SUM(IF(`month`=2,amount,0)) m2,
SUM(IF(`month`=3,amount,0)) m3,SUM(IF(`month`=4,amount,0)) m4 FROM 表名 GROUP BY `year`;
例子3
表形式如下: (7)
Year Salary
2018 1000
2019 2000
2020 3000
2021 4000
想得到如下形式的查询结果
Year Salary
2018 1000
2019 3000
2020 6000
2021 10000
这道题的规律是,比之年份小的,Salary全部加起来.用到的是自连接,一张表控制对应的Salary,另一张表找到年份比它大的 Salary值,然后求和.
SELECT t1.`year`,SUM(t2.salary) FROM 表名 t1 JOIN 表名 t2 ON t1.salary >= t2.salary
GROUP BY t1.salary ORDER BY SUM(t2.salary) ASC;
总结
1.if()函数与ifnull()的区别,if()函数是用来做判断的,其语法有点类似三目运算;
ifnull()函数是判断那一列如果有null值的话,就让那个null变为0,因为null参加计算结果都为空.
2.使用聚合函数相当于在表中加多一列,聚合函数有求AVG(),MAX(),MIN(),COUNT(),SUM().
3.聚合函数使用分组,表示对分组后的数据的统计;不使用分组,表示对整张表的统计.