SQL基础教程之行转列Pivot函数_数据库其它

来源:脚本之家  责任编辑:小易  

http://www.w3school.com.cn/sql/index.asp这里面的教程应该说,算是最基础的,自己翻翻,很多的内容www.zgxue.com防采集请勿采集本网。

前言

未来的一个月时间中,会总结一系列SQL知识点,一次只总结一个知识点,尽量说明白,下面来说说SQL 中常用Pivot 函数(这里是用的数据库是SQLSERVER,与其他数据库是类似的,大家放心看就好)

http://www.xfbbs.com/CodeShow/28/Software_6079.html http://www.verycd.com/topics/57507/ http://www.verycd.com/topics/155116/

让我们先从一个虚构的场景中来着手吧

数据库技术是程序开发人员必须掌握的技术,网页学习网SQL Server基础教程以SQL Server 2005为主要开发工具来介绍SQL Server数据库的基本操作、数据库设计、数据库高级查询等。详细教程可以看:

万国来朝,很多供应商每天都汇报各自的收入情况。先来创建一个DailyIncome 表

网页版本的 www.w3school.com.cn www.w3school.com www.w3school.cn www.w3school.net 如果还不行就再问我,或者直接加我msn haijiancn@hotmail.com 或者qq 我给你 里边有最基础的 sql使用

create table DailyIncome(VendorId nvarchar(10), IncomeDay nvarchar(10), IncomeAmount int)--VendorId 供应商ID,--IncomeDay 收入时间--IncomeAmount 收入金额

sys.database是SQL Server数据库的系统表,里面存放的是系统中的全部数据库对象的信息,比如,有哪些数据库,主键,约束之类的。USE master GO 判断是否存在archive数据库 IF EXISTS(SELECT*FROM

紧接着来插入数据看看

第一,表中应该有个编号字段 利用编号删除 delete from 表 where id in(1,2)(删除表的这两行) update 表 set 字段='' where id in(1,2)(删除表的字段内容) 第二,如果这两行数据和别的某一行

(留意看下,有的供应商某天中会有多次收入,应该是分批进账的)

insert into DailyIncome values ('SPIKE', 'FRI', 100)insert into DailyIncome values ('SPIKE', 'MON', 300)insert into DailyIncome values ('FREDS', 'SUN', 400)insert into DailyIncome values ('SPIKE', 'WED', 500)insert into DailyIncome values ('SPIKE', 'TUE', 200)insert into DailyIncome values ('JOHNS', 'WED', 900)insert into DailyIncome values ('SPIKE', 'FRI', 100)insert into DailyIncome values ('JOHNS', 'MON', 300)insert into DailyIncome values ('SPIKE', 'SUN', 400)insert into DailyIncome values ('JOHNS', 'FRI', 300)insert into DailyIncome values ('FREDS', 'TUE', 500)insert into DailyIncome values ('FREDS', 'TUE', 200)insert into DailyIncome values ('SPIKE', 'MON', 900)insert into DailyIncome values ('FREDS', 'FRI', 900)insert into DailyIncome values ('FREDS', 'MON', 500)insert into DailyIncome values ('JOHNS', 'SUN', 600)insert into DailyIncome values ('SPIKE', 'FRI', 300)insert into DailyIncome values ('SPIKE', 'WED', 500)insert into DailyIncome values ('SPIKE', 'FRI', 300)insert into DailyIncome values ('JOHNS', 'THU', 800)insert into DailyIncome values ('JOHNS', 'SAT', 800)insert into DailyIncome values ('SPIKE', 'TUE', 100)insert into DailyIncome values ('SPIKE', 'THU', 300)insert into DailyIncome values ('FREDS', 'WED', 500)insert into DailyIncome values ('SPIKE', 'SAT', 100)insert into DailyIncome values ('FREDS', 'SAT', 500)insert into DailyIncome values ('FREDS', 'THU', 800)insert into DailyIncome values ('JOHNS', 'TUE', 600)

让我们先来看看前十行数据:

select top 10 * from DailyIncome

如图所示:

DailyIncome

虽然数据是能够完全给展示了,但好像一眼望去不能得到对我们用处更大的信息,比如说我们想得到每个供应商的每天的总收入,这时我们应该做一些数据形式的转变了,平常的所用的是这样的。

select VendorId ,sum(case when IncomeDay='MoN' then IncomeAmount else 0 end) MON,sum(case when IncomeDay='TUE' then IncomeAmount else 0 end) TUE,sum(case when IncomeDay='WED' then IncomeAmount else 0 end) WED,sum(case when IncomeDay='THU' then IncomeAmount else 0 end) THU,sum(case when IncomeDay='FRI' then IncomeAmount else 0 end) FRI,sum(case when IncomeDay='SAT' then IncomeAmount else 0 end) SAT,sum(case when IncomeDay='SUN' then IncomeAmount else 0 end) SUNfrom DailyIncome group by VendorId

得到如下的结果:

case when结果

如果大家仔细看结果的话,会有这样的发现,这是把VendorID进行了分组,并且对于每组中IncomeDay这一列中的值都变成了新的列名字,然后对IncomeAmount进行求和操作。

这样写可能是有些麻烦,别着急,我们用Pivot函数进行行转列试下。

select * from DailyIncome ----第一步pivot (sum (IncomeAmount) ----第三步for IncomeDay in ([MON],[TUE],[WED],[THU],[FRI],[SAT],[SUN]) ---第二步) as AvgIncomePerDay

来解释下,要想用好Pivot函数,应该理解代码注释中的这几步。

第一步:肯定是要明白数据源了,这里是DailyIncome

第二步:要明白要想让哪一列的值做新的列名字

第三步:要明白对于这新的列要求那些值呢?

下面有个练习题目,做之前不要看答案啊

问:对于SPIKE这家供应商来说,每天最大的入账金额。

select * from DailyIncomepivot (max (IncomeAmount) for IncomeDay in ([MON],[TUE],[WED],[THU],[FRI],[SAT],[SUN])) as MaxIncomePerDaywhere VendorId in ('SPIKE')

参考链接如下:

1.Pivot tables in SQL Server. A simple sample

2.行转列:SQL SERVER PIVOT与用法解释

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对真格学网的支持。

不好我是绝对不会推荐你的.你来我空间我这两天整理了一个教程.!进去看日志里面有!http://user.qzone.qq.com/392052039/blog/1234613536放心吧你不会后悔的!内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • mysql 行转列和列转行实例详解
  • sql语句实现行转列的3种方法实例
  • sqlserver行转列实现思路记录
  • mysql存储过程中使用动态行转列
  • mssql 数据库表行转列,列转行终极方案
  • sql server 2000 行转列的实现(横排)
  • sql查询语句行转列横向显示实例解析
  • sql动态行转列的两种方法
  • table 行转列的sql详解
  • sql行转列和列转行代码详解
  • sql四舍五入、向下取整、向上取整函数介绍
  • sql注入之手工注入示例详解
  • 交叉表查询sql语句
  • mybatis查询延迟加载详解及实例
  • 在postgresql中使用日期类型时一些需要注意的地方
  • linux下 mysql oracle 简单使用手册
  • 大数据时代的数据库选择:sql还是nosql?
  • 关于adox的相关知识
  • 为什么你不要收缩数据库文件(国外翻译)
  • 数据库设计技巧[转]
  • sql基础教程
  • SQL新人基础教程哪里有?
  • 各位高手,请问一下SQL基本教程,即入门教程在那里可以找得到?
  • sql入门新手教程
  • 谁有SQL数据库的入门视频教程啊
  • 有没有好一点的SQL教程!
  • SQL基础教程
  • 看sql server基础教程时的疑问
  • sql server基础教程
  • sql2000的入门教程哪种比较好啊
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全mssqlmysqlmariadboracledb2mssql2008mssql2005sqlitepostgresqlmongodbredisaccess数据库文摘数据库其它首页数据库其它mysql 行转列和列转行实例详解sql语句实现行转列的3种方法实例sqlserver行转列实现思路记录mysql存储过程中使用动态行转列mssql 数据库表行转列,列转行终极方案sql server 2000 行转列的实现(横排)sql查询语句行转列横向显示实例解析sql动态行转列的两种方法table 行转列的sql详解sql行转列和列转行代码详解sql四舍五入、向下取整、向上取整函数介绍sql注入之手工注入示例详解交叉表查询sql语句mybatis查询延迟加载详解及实例在postgresql中使用日期类型时一些需要注意的地方linux下 mysql oracle 简单使用手册大数据时代的数据库选择:sql还是nosql?关于adox的相关知识为什么你不要收缩数据库文件(国外翻译)数据库设计技巧[转]sql join on 用法mysql mysqldump命令使用详解sqlserver、mysql、oracle三种数sql中代替like语句的另一种写法如何让sql运行得更快关于adox的相关知识如何取得一个表的所有字段名用逗sql server下数据库链接的使用方sql server 2005的表分区sql 查询语句积累[数据库] 通用分页存储过程access转成sql数据库的方法mysql与oracle 差异比较之七 其它深入sql中pivot 行列转换详解[转载]让sql运行得更快sql注入详解(扫盲篇)详解数据库中跨库数据表的运算200行代码轻松实现一个简单的区块链什么是数据库索引 有哪些类型和特点一个多表查询的sql语句
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved