假设有一个表如下:

日期 时间 售货金额
2006-01-02 早上 50
2006-01-02 中午 20
2006-01-02  晚上 30
2006-01-02 零晨 40
2006-01-03 早上 40
2006-01-03 中午 60
2006-01-03 晚上 50
2006-01-03 零晨 50
2006-01-04 早上 80
2006-01-04  中午 60
2006-01-04 晚上 20
2006-01-04  零晨 40

  能否用行转列的方式在进行数据查询中将上面数据的查询结果显示为:

日期  早上 中午 晚上 零晨 金额小计
2006-01-02 50 20 30 40 140
2006-01-03 40 60 50  50 200
2006-01-04 80 60  30 20 190
 .........          

  SQL 2005中的处理方式:

  测试环境

Create table T(日期 datetime,时间 varchar(20),售货金额 int) insert into T select '2006-01-02','早上',50 union all select '2006-01-02','中午',20 union all select '2006-01-02','晚上',30 union all select '2006-01-02','零晨',40 union all select '2006-01-03','早上',40 union all select '2006-01-03','中午',60 union all select '2006-01-03','晚上',50 union all select '2006-01-03','零晨',50 union all select '2006-01-04','早上',80 union all select '2006-01-04','中午',60 union all select '2006-01-04','晚上',20 union all select '2006-01-04','零晨',40

  查询

select * ,金额小计=(select sum(售货金额) from T where 日期=PT.日期 ) from T as TAB PIVOT ( max(售货金额) for 时间 in ([早上],[中午],[晚上],[零晨]) ) as PT

  结果:

日期 早上 中午 晚上 零晨 金额小计
2006-01-02 00:00:00.000 50 20 30 40 140
2006-01-03 00:00:00.000 40 60  50 50 200
2006-01-04 00:00:00.000 80  60 20 40 200

  删除测试环境

Drop Table T

  动态SQL:

DECLARE @S VARCHAR(MAX) SET @S='' SELECT @S=@S+',['+时间+']' FROM T GROUP BY 时间 SET @S=STUFF(@S,1,1,'') EXEC(' select 日期,'+@S+',金额小计=(select sum(售货金额) from T where 日期=PT.日期 ) from T as TAB PIVOT ( max(售货金额) for 时间 in ('+@S+') ) as PT ')

SQL Server 2005 处理交叉表的更多相关文章

  1. 在Sql Server 2005中将主子表关系的XML文档转换成主子表“Join”形式的表

    本文转载:http://www.cnblogs.com/Ricky81317/archive/2010/01/06/1640434.html 最近这段时间在Sql Server 2005下做了很多根据 ...

  2. SQL Server 2005导入Excel表问题

    EXCEL导入到SQL Server经常出现“文本被截断,或者一个或多个字符在目标代码页中没有匹配项” 原因: SQL Server的导入导出为了确定数据表的字段类型,取excel文件的前8行来判别. ...

  3. (转)SQL server 2005查询数据库表的数量和表的数据量

    本文转载自:http://hi.baidu.com/ajyajyajy/item/4e2a7f4dc83393d2c1a592c1 use DBNAMEgoselect * from sysobjec ...

  4. 删除指定表的所有索引,包括主键索引,唯一索引和普通索引 ,适用于sql server 2005,

    原文:删除指定表的所有索引,包括主键索引,唯一索引和普通索引 ,适用于sql server 2005, --删除指定表中所有索引 --用法:declare @tableName varchar(100 ...

  5. SQL Server 2005 中的分区表和索引

    SQL Server 2005 中的分区表和索引 SQL Server 2005          69(共 83)对本文的评价是有帮助 - 评价此主题   发布日期 : 3/24/2005 | 更新 ...

  6. SQL Server 2005中的分区表(六):将已分区表转换成普通表(转)

    我的俄罗斯名叫作“不折腾不舒服斯基”,所以,不将分区表好好折腾一下,我就是不舒服. 在前面,我们介绍过怎么样直接创建一个分区表,也介绍过怎么将一个普通表转换成一个分区表.那么,这两种方式创建的表有什么 ...

  7. SQL Server 2005入门到精通(案例详解)

    SQL Server 2005基础应用   一.数据库的基本操作 --创建数据库 create database new_db2 on primary ( name='new.mdf', filena ...

  8. 回首经典的SQL Server 2005

    原创文章转载请注明出处:@协思, http://zeeman.cnblogs.com SQL Server是我使用时间最长的数据库,算起来已经有10年了.上世纪90年代,微软在软件开发的所有领域高歌猛 ...

  9. Linux下使用FreeTDS访问MS SQL Server 2005数据库(包含C测试源码)

    Linux下使用FreeTDS访问MS SQL Server 2005数据库(包含C测试源码) http://blog.csdn.net/helonsy/article/details/7207497 ...

随机推荐

  1. SEO之网站稳定

    周未给大伙推荐个电影 :<环太平洋> http://947kan.com/movie/kehuan/45659/ 主要讲述了人类对抗从太平洋海底的时空裂缝不断传送过来的大怪兽,保卫家园的故 ...

  2. 在JSP中上传图片到数据库中

    第一步:建立数据库 create table test_img(id number(4),name varchar(20),img long raw); 第二步:(NewImg.html) <h ...

  3. github改local用户名和email

    github改local用户名和email 进入cd ~/.ssh 修改git config --global user.name “用户名” config --global user.email 电 ...

  4. guava学习--Objects

    转载:https://my.oschina.net/realfighter/blog/349821 Java中的Object类是所有Java类的超类(也就是祖先),所有对象都实现Object类中的方法 ...

  5. 判断整数是否能被n整除

    (1)1与0的特性:         1是任何整数的约数,即对于任何整数a,总有1|a.         0是任何非零整数的倍数,a≠0,a为整数,则a|0. (2)若一个整数的末位是0.2.4.6或 ...

  6. linux 硬盘速度测试

    [root@iZ25oat874uZ data]# time dd if=/dev/zero of=/var/test bs=8k count=1000000 1000000+0 records in ...

  7. 基于注解的Spring AOP示例

    基于注解的Spring AOP示例 目录 在XML配置文件中开启 @AspectJ 支持 声明切面及切入点 声明通知 测试 结语 在XML配置文件中开启 @AspectJ 支持 要使用Spring的A ...

  8. HashMap 遍历

    Map<String, String> _map = new HashMap<String,String>(); 1.方法一 for (Entry<String, Str ...

  9. 利用WPS 2012/2013 0day针对中国政府部门的定向攻击

    今天早上,我们捕获到一个利用wps 2012/2013 0day针对中国政府部门的钓鱼邮件定向攻击事件. 邮件发件人以2014中国经济形势解析高层报告组委会 标题发出,附件为包含wps2012 0da ...

  10. AJAX格式

    var xmlHttp;function getXmlHttp(){ if(window.ActiveXObject){ xmlHttp = new ActiveXObject("MICRO ...