SQL纵表转横表

1.纵 横表的优缺点

优缺点:

横表:表结构更加的清晰明了,关联查询的一些sql语句也更容易,方便易于后续开发人员的接手,但是如果字段不够,需要新增字段,会改动表结构。

纵表:扩展性更高,如果要增加一个字段,不需要改变表结构,但是一些关联查询会更加麻烦,也不便于维护与后续人员接手。

平常开发,尽量能用横表就不要用纵表,维护成本比较高昂,而且一些关联查询也很麻烦。
 

2.纵表转横表的具体操作

(1)首先创建socres表,具体如下:

 (2)将上面的纵表转换为横表,可以一目了然的看到同学的各科成绩,方便查看,我先看一下转换后的效果:

 (3)

分析:首先查成绩需要学生姓名,那么就需要根据姓名进行分组

语法如下:
select 姓名 from scores group by 姓名


实现代码如下:
select name from scores group by name

 代码实现效果:

我们要拿到其中一门科目的分数,既然我们用到了group by 语句,这里肯定要用聚合函数来求分数。
而且我们只需要语文这一科的成绩,分组出来的 一共有 3列 ,分别是 语文、数学、英语  。  那么就需要判断科目来取分数。
这里符合我们需求的 case 语句就登场了。它和c#中switch-case 作用一样。

sql case 语句语法:

case 字段
    when 值1 then 结果
    when 值2 then 结果2
    ...
    else 默认结果
end

 当用到case 语句语法之后就可以对学生进行成绩查询了

语法如下:

select 姓名,
SUM(case 课程 when  '课程名' then grade else 0 end) 
as 课程名 from scores group by name 

具体代码如下:
select name,
SUM(case course when  '语文' then grade else 0 end) 
as 语文 from scores group by name 

代码实现效果:

既然已经查到了语文成绩,那么其他成绩自然能查询出来

select name,
SUM(case course when  '语文' then grade else 0 end) as 语文 ,
SUM(case course when  '数学' then grade else 0 end) as 数学 ,
SUM(case course when  '英语' then grade else 0 end) as 英语 
from scores group by name

代码实现效果:

 查询出来之后只需要将这个表插入到一个新表中就可以实现将纵表转换为横表了

select name,
SUM(case course when  '语文' then grade else 0 end) as 语文 ,
SUM(case course when  '数学' then grade else 0 end) as 数学 ,
SUM(case course when  '英语' then grade else 0 end) as 英语 
into scores3
from scores group by name

 代码效果如下:

 

  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
纵表转横表是指将关系型数据库中的纵向存储的数据转换为横向存储的形式。在MySQL中,可以使用一些SQL语句和技巧来实现这个转换。 一种常见的方法是使用PIVOT(透视)操作来完成纵表转横表的过程。在MySQL中,没有内置的PIVOT函数,但可以借助CASE WHEN语句和聚合函数来实现类似的功能。 下面是一个示例,假设有一个名为"employees"的表,其中包含了员工的姓名、部门和工资信息: ``` CREATE TABLE employees ( id INT, name VARCHAR(50), department VARCHAR(50), salary DECIMAL(10, 2) ); INSERT INTO employees (id, name, department, salary) VALUES (1, 'John', 'HR', 5000.00), (2, 'Jane', 'Marketing', 6000.00), (3, 'Mike', 'Sales', 7000.00), (4, 'Alice', 'HR', 5500.00); ``` 要将这个纵表转换为横表,以部门为列,员工姓名为行,工资为值,可以使用以下SQL查询: ``` SELECT name, MAX(CASE WHEN department = 'HR' THEN salary ELSE NULL END) AS HR, MAX(CASE WHEN department = 'Marketing' THEN salary ELSE NULL END) AS Marketing, MAX(CASE WHEN department = 'Sales' THEN salary ELSE NULL END) AS Sales FROM employees GROUP BY name; ``` 这个查询使用了CASE WHEN语句将每个部门的工资转换为对应的列,并使用了MAX函数来获取每个员工在不同部门的工资。GROUP BY子句按照员工姓名进行分组。 执行以上查询,将会得到如下结果: ``` +-------+---------+------------+-------+ | name | HR | Marketing | Sales | +-------+---------+------------+-------+ | Alice | 5500.00 | NULL | NULL | | Jane | NULL | 6000.00 | NULL | | John | 5000.00 | NULL | NULL | | Mike | NULL | NULL | 7000.00 | +-------+---------+------------+-------+ ``` 以上就是使用MySQL中的SQL语句实现纵表转横表的方法之一。当然,根据具体的数据结构和需求,可能需要针对性地调整SQL语句来实现更复杂的转换。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值