SQL Server 2005 处理交叉表

转载 2006年05月24日 14:40:00

--原贴:http://community.csdn.net/Expert/topic/4617/4617995.xml?temp=4.882449E-02
日期            时间   售货金额
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 20005中的处理方式:

--测试环境
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

(3 行受影响)
*/
--删除测试环境
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交叉表存储过程

/*   假设有张学生成绩表(tb)如下: Name Subject Result 张三 语文  74 张三 数学  83 张三 物理  93 李四 语文  ...

在存储过程中编写正确的事务处理代码(SQL Server 2000 & 2005)

在 SQL Server 中数据库事务处理是个重要的概念,也稍微有些不容易理解,很多 SQL 初学者编写的事务处理代码存往往存在漏洞,本文介绍了三种不同的方法,举例说明了如何在存储过程事务处理中编写正...

SQL Server 2005利用分区对海量数据的处理

超大型数据库的大小常常达到数百GB,有时甚至要用TB来计算。而单表的数据量往往会达到上亿的记录,并且记录数会随着时间而增长。这不但影响着数据库的运行效率,也增大数据库的维护难度。除了表的数据量外,对表...

在存储过程中编写正确的事务处理代码(SQL Server 2000 & 2005)

在 SQL Server 中数据库事务处理是个重要的概念,也稍微有些不容易理解,很多 SQL 初学者编写的事务处理代码存往往存在漏洞,本文介绍了三种不同的方法,举例说明了如何在存储过程事务处理中编写正...

SQL Server 2005 中的树形数据处理示例

-- 创建测试数据 if exists (select * from dbo.sysobjects where id = object_id(N'[tb]') and OBJECTPROPERTY(i...

SQL Server 2005 笔记(第二章:物理查询处理)

第二章:物理查询处理 1.Table Scan   (图形执行计划图标)   (1)运算符从查询执行计划的 Argument 列所指定的表中检索所有行。如果 WHERE:()谓词出现在 Arg...

SQL Server 2005 中的树形数据处理

-- 创建测试数据 if exists (select * from dbo.sysobjects where id = object_id(N'[tb]') and OBJECTPRO...

SQL Server 2005 日志文件过大处理

由于安装的时候没有计划好空间,默认装在系统盘,而且又没有做自动备份、截断事务日志等,很快LDF文件就达到十几G,或者几十G ,此时就不得不处理了。 备份和计划就不说了,现在就说下怎么把它先删除吧: ...

SQL Server 2005利用分区对海量数据的处理

超大型数据库的大小常常达到数百GB,有时甚至要用TB来计算。而单表的数据量往往会达到上亿的记录,并且记录数会随着时间而增长。这不但影响着数据库的运行效率,也增大数据库的维护难度。除了表的数据量外,对表...

(转载)SQL Server 2005 日志文件过大处理

由于安装的时候没有计划好空间,默认装在系统盘,而且又没有做自动备份、截断事务日志等,很快LDF文件就达到十几G,或者几十G ,此时就不得不处理了。 备份和计划就不说了,现在就说下怎么把它先删除吧: ...
  • jamex
  • jamex
  • 2015年05月18日 18:46
  • 292
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章: SQL Server 2005 处理交叉表
举报原因:
原因补充:

(最多只允许输入30个字)