使用查询让表格纵排变横排

在数据库查询的操作中,常常会见到,让纵向排列的数据变成横向排,这其中涉及到的知识点有聚合函数,分组及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.聚合函数使用分组,表示对分组后的数据的统计;不使用分组,表示对整张表的统计.

posted @ 2022-09-07 23:06  Tmillion  阅读(351)  评论(0编辑  收藏  举报