0. 测试数据集及说明
0.1 准备测试数据
【测试数据1】
WITH Temp1 AS (SELECT &39; AS Name,&39; AS Subject,100 AS ScoresUNION ALLSELECT &39; AS Name,&39; AS Subject,90 AS ScoresUNION ALLSELECT &39; AS Name,&39; AS Subject,80 AS ScoresUNION ALLSELECT &39; AS Name,&39; AS Subject,90 AS ScoresUNION ALLSELECT &39; AS Name,&39; AS Subject,70 AS ScoresUNION ALLSELECT &39; AS Name,&39; AS Subject,60 AS Scores)SELECT * FROMTemp1 结果:Name Subject Scores---- ------- -----------张三 语文100张三 数学90张三 英语80李四 语文90李四 数学70李四 英语60
【测试数据2】
WITH Temp2 AS ( SELECT &39; AS Name,&39; AS Class,NULL AS 英语,NULL AS 数学,100 AS 语文 UNION ALL SELECT &39; AS Name,&39; AS Class,60 AS 英语,70 AS 数学,90 AS 语文 UNION ALL SELECT &39; AS Name,&39; AS Class,80 AS 英语,90 AS 数学,NULL AS 语文 )SELECT * FROM Temp2 结果:Name Class英语数学语文---- ---------- ----------- ----------- -----------张三 八年级二班NULLNULL100李四 三年级二班607090张三 三年级二班8090NULL
0.2 对一维表和二维表理解
测试数据1:
称为:一维表
特征:每条记录的特定字段可能出现值重复
一维表是数据记录的最原始的样子。
一维表包含一列字段表示每条记录的属性。比如说测试数据1中的Subject列
一维表的字段名称即表示该字段下的数据的实际含义。比如说测试数据1中的Scores列下的数据表示成绩
测试数据2:
称为:二维表
特征:列字段名称就是种类信息,每条记录的
二维表则是展示出分类汇总后的数据信息
二维表若无说明,是无法明确数据含义的,比如测试数据2,若是不告诉你这是成绩,你是无法理解数据值的真实含义的
一维表和二维表对比:
按照数据库第一范式:一个实体中不应该包含重复类型的特性,对应到表就是:类似的值不能在一个表的多个列上重复创建表应该按照一维表的格式创建,记录产生信息。若是建表的时候创建为二维表,将所有的种类做为字段,则可能出现表的字段非常的多,当种类有所添加的时候,后续还要继续添加字段。
第二排中间那个印有“set”这三个字母的按键就是设置键,希望我的回答能帮到你。
一维表方便存储数据,同样也是便于后期查询
二维表可以直观的表现数据的信息,是用于展示的报表和报告
1. 透视转换
1.1 使用标准SQL进行数据透视
企业回苏州中译翻译有限公司是经政府特批注册的专业翻译服务机构,常年为社会团体、政府机关、企事业单位提供跨行业、多语种、高水平的翻译服务。拥有较强的综合实力、坚实的客户基础、高效的管理队伍和经验丰富的各领域专业翻译人才。中译翻译立足于。
--注意这里实现业务场景,在CASE WHEN语句中--我们应该使用默认的ELSE NULL ,而不是ELSE 0。没有数据是没有数据,0是0SELECT Name, SUM(CASE WHEN Subject =&39; THEN Temp1.Scores ElSE NULL END) AS 语文 , SUM(CASE WHEN Subject =&39; THEN Temp1.Scores ELSE NULL END) AS 数学 , SUM(CASE WHEN Subject =&39; THEN Temp1.Scores ELSE NULL END) AS 英语 FROM Temp1GROUP BY Temp1.Name结果:Name 英语数学语文---- ----------- ----------- -----------李四60 7090张三80 90100
【说明】:使用标准的SQL语句进行数据的透视转换,我们可以直白的发现透视转换,是分为三个阶段的:
分组-->扩展-->聚合
以上例说明:
分组:我们按照Name字段进行分组,使每一个用户产生一条记录
使用GROUP BY实现分组
“设置”的英文写法:intercalate 读法:英 [ɪn'tɜːkəleɪt; ,ɪntəkə'leɪt] 美 [ɪn'tɝkə,let]释义:vt. 设置;插入 intercalate。
扩展:扩展是对列的扩展,使用case语句, 对三个科目(语文,数学,英语)扩展为列使用SELECT 配合CASE WHEN实现
聚合:按照分组依据进行聚合,这里按照Name字段分组,使用SUM函数对Scores字段聚合
使用任一聚合函数聚合
对照上述三个逻辑步骤:
Name字段:分组依据字段(分组元素)。指定要用于透视结果表的左侧列,也称为设置键
Subject字段:待扩展字段(待扩展元素)。透视结果表中的列头所在的列,也称为透视键,&34;为目标列的列名的集合,又称为透视输出列
1.2 使用T-SQL中pivot函数进行数据透视
【函数】:pivot【作用】:行转列函数,SQL Server2005【语法】:pivot(任一聚合函数 for 需转列的值所在列名 in (需转为列名的值))【用法】:select …from table pivot(……) as T
【示例1】:现有一张成绩表,表中记录了每个学生每科目的成绩,如下。现在需要将科目作为列头,统计每个学生的成绩。
WITH Temp1 AS (SELECT &39; AS Name,&39; AS Subject,100 AS ScoresUNION ALLSELECT &39; AS Name,&39; AS Subject,90 AS ScoresUNION ALLSELECT &39; AS Name,&39; AS Subject,80 AS ScoresUNION ALLSELECT &39; AS Name,&39; AS Subject,90 AS ScoresUNION ALLSELECT &39; AS Name,&39; AS Subject,70 AS ScoresUNION ALLSELECT &39; AS Name,&39; AS Subject,60 AS Scores)SELECT T.Name,T.英语,T.数学,T.语文 FROM Temp1 PIVOT(SUM(Scores) FOR [Subject] IN (语文,数学,英语)) T;结果:Name英语数学语文---- ----------- ----------- -----------李四 607090张三 8090100
【注意1】:我们是按照以下格式:select …from table pivot(任意聚合函数(聚合字段) for 待扩展字段名 in (待扩展元素集)) as T使用pivot对table进行数据透视
若是table中的字段既不是聚合字段,又不是待扩展字段,则会默认为pivot函数中的分组依据的字段。
所以使用pivot函数进行数据透视的结果集一般不会是数据库中的原表,而是一个查询出的特定字段的结果集
一般在应用软件上面,系统设置的英文是 SET 或是SETTING 当然也有 SYSTEM XX 在系统单片机里面是 menu 或SYSTEM XX 问题八:手机设置的英文怎么写 phone setttings 问题九:设置菜单的英文是什么? 设置菜单:1. Setup M。
【注意2】:若待扩展元素集是非常规标识符,比如说日期或数字开头的其他类型数据,则我们需要使用方括号将每一个待扩展展元素括起。
【示例2】:
现在在测试数据1中添加一个Class字段,使用pivot函数透视数据
【说明】:结果集Temp1中的class既不是聚合字段,也不是待扩展字段,所以会被默认为是分组依据!
而往往,我们期望的分组依据只要Name字段。
所以一般都是建议不要直接对数据库中的基础表进行透视操作,而是将特定字段查询出来作为一个表结果集,之后在对这个结果集进行透视操作。
1.3 关于 待扩展元素集合获取的方式
见:T-SQL——透视PIVOT动态获取待扩展元素集
2. 逆透视转换
【逆透视】:逆透视转换将来自单个记录中多个列的值扩展为单个列中具有同样值的多个记录,使得非规范的数据集成为较规范的版本。
2.1 使用标准SQL进行数据逆透视
数据的逆透视也是分为三步:请客,斩首,收下当狗
啊唾,不对,应该是是:生成副本-->提取元素-->删除不相干交叉
WITH Temp AS ( --测试数据集 SELECT &39; AS Name,&39; AS Class,NULL AS 英语,NULL AS 数学,100 AS 语文 UNION ALL SELECT &39; AS Name,&39; AS Class,60 AS 英语,70 AS 数学,90 AS 语文 UNION ALL SELECT &39; AS Name,&39; AS Class,80 AS 英语,90 AS 数学,NULL AS 语文 ) ,Temp1 AS( --为每一行生成副本 --与需要逆透视的列交叉连接获取笛卡尔积 SELECT * FROMTemp CROSS JOIN( VALUES(&39;),(&39;),(&39;)) AS T(SubjectName) --结果 --Name Class 英语 数学 语文 SubjectName --张三 八年级二班 NULL NULL 100 英语 --张三 八年级二班 NULL NULL 100 数学 --张三 八年级二班 NULL NULL 100 语文 --李四 三年级二班 60 70 90 英语 --李四 三年级二班 60 70 90 数学 --李四 三年级二班 60 70 90 语文 --张三 三年级二班 80 90 NULL 英语 --张三 三年级二班 80 90 NULL 数学 --张三 三年级二班 80 90 NULL 语文 ) ,Temp2 AS ( --当前行SubjectName为英语则取英语列 SELECT Name,Class,Temp1.SubjectName, CASE Temp1.SubjectName WHEN &39; THEN 英语 WHEN &39; THEN 数学 WHEN &39; THEN 语文END AS ScoresFROM Temp1 --结果 --Name Class SubjectName Scores --张三 八年级二班 英语 NULL --张三 八年级二班 数学 NULL --张三 八年级二班 语文 100 --李四 三年级二班 英语 60 --李四 三年级二班 数学 70 --李四 三年级二班 语文 90 --张三 三年级二班 英语 80 --张三 三年级二班 数学 90 --张三 三年级二班 语文 NULL)--删除不相关交叉行(排除NULL值行)SELECT * FROM Temp2 WHERETemp2.Scores IS NOT NULL--结果--Name Class SubjectName Scores--张三 八年级二班 语文 100--李四 三年级二班 英语 60--李四 三年级二班 数学 70--李四 三年级二班 语文 90--张三 三年级二班 英语 80--张三 三年级二班 数学 90
2.2 使用T-SQL中unpivot函数进行数据逆透视
【函数】:unpivot【作用】:列转行函数,SQL Server2005【语法】:unpivot(作为属性值列的列名 for 属性名 in (同一属性的列名))【用法】:select …from table unpivot(……) as T
【示例1】
WITH Temp2 AS ( SELECT &39; AS Name,&39; AS Class,NULL AS 英语,NULL AS 数学,100 AS 语文 UNION ALL SELECT &39; AS Name,&39; AS Class,60 AS 英语,70 AS 数学,90 AS 语文 UNION ALL SELECT &39; AS Name,&39; AS Class,80 AS 英语,90 AS 数学,NULL AS 语文 )SELECT * FROM Temp2 UNPIVOT(Socore FOR Subject IN(英语,数学,语文)) T;结果:NameClassSocoreSubject---- ---------- ------------------张三 八年级二班100 语文李四 三年级二班60英语李四 三年级二班70数学李四 三年级二班90语文张三 三年级二班80英语张三 三年级二班90数学
3. 透视之后再逆透视数据信息减少
这只是巧合而已,因为我们的测试数据1中没有出现相同属性(同一个人相同科目)的多条记录:比如说,如果李四有两条英语成绩如下:
之前详述了透视包含三个逻辑步骤,分组-->扩展-->聚合。
因为透视包含了聚合,表的信息量减少了,所以在做逆透视无法还原成原始数据。
简单的说:
UNPIVOT 并不完全是 PIVOT 的逆操作。PIVOT 执行聚合,并将多个可能的行合并为输出中的一行。UNPIVOT 不重现原始表值表达式的结果,因为行已被合并。
另外,UNPIVOT 输入中的 NULL 值也在输出中消失了。如果值消失,表明在执行 PIVOT 操作前,输入中可能就已存在原始 NULL 值。