表结构:
PV IP Date
1015 100 2010-01-01
10315 1100 2010-01-02
12015 2100 2010-01-03需要的结果:Items 2010-01-01 2010-01-02 2010-01-03
PV 1015 10315 12015
IP 100 1100 2100
需要按日期进行查询.
请直接上SQL.. 明天上午结贴
解决方案 »
- 简单的SQL语句
- 如何在把服务器上的数据库备份到客户机上?
- 使用sql语句team in (另一个表里的字段值)时提示错误
- 一个简单的回滚问题
- 如何用SQL把varchar型的转化成datetime型的?(没你想的那么简单)
- 关于98的机器连不上sql server 2000中文企业版的问题
- 可以把一个库中的某个表转移到另一个库中吗?
- 全文检索结果为什么为空?
- 在SQL语句中怎样取得某条纪录在表中的行号
- sql server 2000的sql里面datetime怎么写?
- SQL3表联合查询的问题
- select distinct (col004+col015) into def from abc,报错,去掉into后ok,请问如何加入into语句
/*------------------------------------------------------------------
-- Author : htl258(Tony)
-- Date : 2010-04-13 00:47:57
-- Version: Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86)
Jul 9 2008 14:43:34
Copyright (c) 1988-2008 Microsoft Corporation
Developer Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 3)------------------------------------------------------------------*/
--> 生成测试数据表:tbIF OBJECT_ID('[tb]') IS NOT NULL
DROP TABLE [tb]
GO
CREATE TABLE [tb]([PV] INT,[IP] INT,[Date] varchar(10))
INSERT [tb]
SELECT 1015,100,N'2010-01-01' UNION ALL
SELECT 10315,1100,N'2010-01-02' UNION ALL
SELECT 12015,2100,N'2010-01-03'
GO
--SELECT * FROM [tb]-->SQL查询如下:
declare @s varchar(8000)
select @s=ISNULL(@s+',','')+QUOTENAME(date) from tb group by date
exec('select * from tb unpivot(value for Items in(PV,IP)) b pivot(max(value) for Date in('+@s+'))c')
/*
Items 2010-01-01 2010-01-02 2010-01-03
IP 100 1100 2100
PV 1015 10315 12015
*/
if exists (select * from dbo.sysobjects
where id = object_id(N'[dbo].[p_zj]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[p_zj]
GO
/*--行列互换的通用存储过程(原著:邹建):将指定的表,按指定的字段进行行列互换*/create proc p_zj
@tbname sysname, --要处理的表名
@fdname sysname, --做为转换的列名
@new_fdname sysname='' --为转换后的列指定列名
as
declare @s1 varchar(8000) , @s2 varchar(8000),
@s3 varchar(8000) , @s4 varchar(8000),
@s5 varchar(8000) , @i varchar(10)
select @s1 = '' , @s2 = '' , @s3 = '' , @s4 = '' , @s5 = '' , @i = '0'
select @s1 = @s1 + ',@' + @i + ' varchar(8000)',
@s2 = @s2 + ',@' + @i + '=''' + case isnull(@new_fdname , '') when '' then ''
else @new_fdname + '=' end + '''''' + name + '''''''',
@s3 = @s3 + 'select @' + @i + '=@' + @i + '+'',['' + [' + @fdname +
']+'']=''+cast([' + name + '] as varchar) from [' + @tbname + ']',
@s4 = @s4 + ',@' + @i + '=''select ''+@' + @i,
@s5 = @s5 + '+'' union all ''+@' + @i,
@i=cast(@i as int)+1
from syscolumns
where object_id(@tbname)=id and name<>@fdnameselect @s1=substring(@s1,2,8000),
@s2=substring(@s2,2,8000),
@s4=substring(@s4,2,8000),
@s5=substring(@s5,16,8000)
exec('declare ' + @s1 + 'select ' + @s2 + @s3 + 'select ' + @s4 + '
exec(' + @s5 + ')')
go--用上面的存储过程测试:create table Test(月份 varchar(4), 工资 int, 福利 int, 奖金 int)
insert Test
select '1月',100,200,300 union all
select '2月',110,210,310 union all
select '3月',120,220,320 union all
select '4月',130,230,330
goexec p_zj 'Test', '月份' , '项目'drop table Test
drop proc p_zj/*
项目 1月 2月 3月 4月
---- ----------- ----------- ----------- -----------
福利 200 210 220 230
工资 100 110 120 130
奖金 300 310 320 330(所影响的行数为 3 行)
*//*
静态写法(SQL2005)
*/
--测试环境
create table Test(月份 varchar(4), 工资 int, 福利 int, 奖金 int)
insert Test
select '1月',100,200,300 union all
select '2月',110,210,310 union all
select '3月',120,220,320 union all
select '4月',130,230,330
go
--测试语句
SELECT * FROM
(
SELECT 考核月份,月份,金额 FROM
(SELECT 月份, 工资, 福利, 奖金 FROM Test) p
UNPIVOT
(金额 FOR 考核月份 IN (工资, 福利, 奖金))AS unpvt
) T
PIVOT
(MAX(金额) FOR 月份 in ([1月],[2月],[3月],[4月]))AS pt--测试结果/*
考核月份 1月 2月 3月 4月
------- ----- ----- ------ -------
福利200210220230
工资100110120130
奖金300310320330
*/--删除环境
Drop table Test
当按时间段来做这个表的汇总SQL该怎么写.unpivot和pivot从没用过这两个函数..
谢谢.
DROP TABLE [tb]
GO
CREATE TABLE [tb]([PV] INT,[IP] INT,[Date] varchar(10))
INSERT [tb]
SELECT 1015,100,N'2010-01-01' UNION ALL
SELECT 10315,1100,N'2010-01-02' UNION ALL
SELECT 12015,2100,N'2010-01-03'
GO
--SELECT * FROM [tb]-->SQL查询如下:
declare @s varchar(8000)
select @s=ISNULL(@s+',','')+QUOTENAME(date) from tb group by date
exec('select * from tb unpivot(value for 别名 in(PV,IP)) b pivot(max(value) for Date in('+@s+'))c')
/*
别名 2010-01-01 2010-01-02 2010-01-03
IP 100 1100 2100
PV 1015 10315 120155
*/
http://topic.csdn.net/u/20080614/17/22e73f33-f071-46dc-b9bf-321204b1656f.html?30801
还是看看精华帖吧。