SQL如何实现横表与纵表相互转换

目录
  • 一、横表简单概述
  • 二、纵表简单概述
  • 三、纵表转横表代码如下以及视图展示
  • 四、横表转纵表代码如下以及视图展示
  • 五、横表、纵表优点与缺点
  • 六、总结

一、横表简单概述

横表是普通的建表方式。例如:表结构为主键、字段1、字段2、字段3…。

二、纵表简单概述

纵表的表结构为主键、字段代码、字段值,字段代码则为字段1、字段2、字段3…。

三、纵表转横表代码如下以及视图展示

1.纵表视图如下:

2.纵表转换成横表视图如下:

3.sql语句如下所示:

select student_name,
	sum(case ts.subject when 'C语言' then ts.score else '' end) as C语言,
	sum(case ts.subject when '数据结构' then ts.score else '' end) as 数据结构,
	sum(case ts.subject when '操作系统' then ts.score else '' end) as 操作系统
from t_student ts
group by ts.student_name;

四、横表转纵表代码如下以及视图展示

1.横表视图如下:

2.横表转换成纵表视图如下:

3.sql语句如下所示:

select ts.studnet_name,
'C语言' as 科目,
ts.`C语言` as 成绩
from t_student1 ts
union all
select ts.studnet_name,
'数据结构' as 科目,
ts.`数据结构` as 成绩
from t_student1 ts
union all
select ts.studnet_name,
'操作系统' as 科目,
ts.`操作系统` as 成绩
from t_student1 ts
order by studnet_name,科目

五、横表、纵表优点与缺点

1.横表
优点:一行表示了一个实体记录,清晰可见。
缺点:如果现在要给这个表加一个字段,那么就必须重建表结构。

2.纵表
优点:如果现在要给这个表加一个字段,只需要添加一些记录。
缺点:数据描述不是很清晰,而且会造成数据库数据很多。另如果需要分组统计,要先group by,较繁琐

六、总结

应该把不容易改动表结构的设计成横表,把容易经常改动不确定的表结构设计成纵表。

到此这篇关于SQL如何实现横表与纵表相互转换的文章就介绍到这了,更多相关SQL 横表与纵表转换内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SQL Server纵表与横表相互转换的方法

    1,纵表转横表 纵表结构 Table_A: 转换后的结构: 纵表转横表的SQL示例: SELECT Name , SUM(CASE WHEN Course = N'语文' THEN Grade ELSE 0 END) AS Chinese , SUM(CASE WHEN Course = N'数学' THEN Grade ELSE 0 END) AS Mathematics , SUM(CASE WHEN Course = N'英语' THEN Grade ELSE 0 END) AS Engl

  • Mysql纵表转换为横表的方法及优化教程

    1.纵表与横表 纵表:表中字段与字段的值采用key-value形式,即表中定义两个字段,其中一个字段里存放的是字段名称,另一个字段中存放的是这个字段名称代表的字段的值. 例如,下面这张ats_item_record表,其中field_code表示字段,后面的record_value表示这个字段的值 优缺点: 横表:表结构更加的清晰明了,关联查询的一些sql语句也更容易,方便易于后续开发人员的接手,但是如果字段不够,需要新增字段,会改动表结构. 纵表:扩展性更高,如果要增加一个字段,不需要改变表结

  • SQL如何实现横表与纵表相互转换

    目录 一.横表简单概述 二.纵表简单概述 三.纵表转横表代码如下以及视图展示 四.横表转纵表代码如下以及视图展示 五.横表.纵表优点与缺点 六.总结 一.横表简单概述 横表是普通的建表方式.例如:表结构为主键.字段1.字段2.字段3…. 二.纵表简单概述 纵表的表结构为主键.字段代码.字段值,字段代码则为字段1.字段2.字段3…. 三.纵表转横表代码如下以及视图展示 1.纵表视图如下: 2.纵表转换成横表视图如下: 3.sql语句如下所示: select student_name, sum(ca

  • SQL Server在AlwaysOn中使用内存表的“踩坑”记录

    前言 最近因为线上alwayson环境的一个数据库上使用内存表.经过大概一个星期监控程序发现了一个非常严重问题这个数据库的日志文件不会截断,已用空间一直在增加(存在定时的每个小时的日志备份),同时内存表数据库文件也无法删除,下面就介绍一下后面我的处理过程,话不多说了,来一起看看详细的介绍吧. 数据库:SQL Server2014 Enterprise Edition (64-bit) 删除文件 使用一个单独非alwayson环境的数据库测试. 一.创建内存表 ---创建内存表文件组 ALTER

  • Oracle 数据显示 横表转纵表

    1.建表 复制代码 代码如下: -- Create table create table test ( dm1 char(3), dm2 char(3), mc1 nvarchar2(20), val nvarchar2(20) ) 2.填入数据如下: DM1 DM2 MC1 VAL 101 1 c1 100 101 1 c2 80 101 1 c3 40 101 2 c1 30 101 2 c2 80 102 4 c1 9 102 6 c2 50 转换后数据显示如下: DM1 DM2 c1 c

  • Mysql跨表更新 多表update sql语句总结

    假定我们有两张表,一张表为Product表存放产品信息,其中有产品价格列Price:另外一张表是ProductPrice表,我们要将ProductPrice表中的价格字段Price更新为Price表中价格字段的80%. 在Mysql中我们有几种手段可以做到这一点,一种是update table1 t1, table2 ts ...的方式: 复制代码 代码如下: UPDATE product p, productPrice pp SET pp.price = pp.price * 0.8 WHER

  • sql语句实现四种九九乘法表

    下面用while 和 if 条件写的SQL语句的四种九九乘法表  sql语句实现--x 左下角九九乘法表 DECLARE @I INT ,@J INT,@S VARCHAR() SET @I= WHILE @I< BEGIN SET @J= SET @S='' WHILE @J<=@I BEGIN SET @S=@S+CAST(@J AS CHAR())+'*'+CAST(@I AS CHAR())+'='+CAST((@I*@J)AS CHAR()) SET @J=@J+ END PRINT

  • SQL Server删除表及删除表中数据的方法

    本文介绍SQL Server中如何删除表,如何删除表中的数据.在删除表数据时有delete和truncate两种方法,delete和truncate有什么区别呢? SQL Server,我们现在基本上使用的最古老的版本应该是SQL Server 2000吧,应该没有更早的版本了吧?!从SQL Server 2000开始,到SQL Server 2005,2008,2012等,T-SQL的处理能力越来越强.今天我们就来说说如何使用T-SQL脚本来删除表,以及删除表中的数据. 删除表和删除表数据这是

  • SQL Server使用Merge语句当源表数据集为空时,无法进行查询的问题

    面举一个例子来具体说明一下: 有两个表SourceTable为登陆表,TargetTable为授权表,如果访问用户在登陆表中,更新授权表的授权级别,否则授权0表示游客.sql语句如下: --SourceTable为登陆表,TargetTable为授权表 --如果访问用户在登陆表中,更新授权表的授权级别,否则授权0表示游客. create table SourceTable(UserName nvarchar(10),Pwd int,[Level] int) create table Target

  • 基于SQL Server中如何比较两个表的各组数据 图解说明

    开始 前一阵子,在项目中碰到这样一个SQL查询需求,有两个相同结构的表(table_left & table_right),如下: 图1. 检查表table_left的各组(groupId),是否在表table_right中存在有一组(groupId)数据(data)与它的数据(data)完全相等. 如图1. 可以看出表table_left和table_right存在两组数据完整相等: 图2. 分析 从上面的两个表,可以知道它们存放的是一组一组的数据:那么,接下来我借助数学集合的列举法和运算进行

  • Sql Server如何查看被锁的表及解锁的方法

    查看被锁表: select spId from master..SysProcesses where db_Name(dbID) = '数据库名称' and spId <> @@SpId and dbID <> 0 解除锁: exec ('Kill '+cast(@spid as varchar)) 查看被锁表: select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName f

  • SQL Server查询某个字段在哪些表中存在

    一.查询SQL Server中所有的表 SQL语句: SELECT * FROM sys.tables name列表示所有的表名. 二.查询SQL Server中所有的列 SQL语句: SELECT * FROM sys.columns name列表示所有的字段名称. 两张表根据object_id进行关联 语法: select * from sys.tables tinner join sys.columns c on t.object_id=c.object and c.name='要查询的字

随机推荐