超难sql问题 50 分超值
表:
帐号 时间 项目 分数
01 2007-4-4:10:10:11 01 5
01 2007-4-4:10:11:11 02 14
01 2007-4-4:10:13:11 01 7
02 2007-4-4:10:14:11 01 6
得到一个视图:
机构如下:
帐号 日期 项目1 项目2........
01 2007-4-4 7 14
02 2007-4-4 6
核心提示 取得所有帐号一天内各项的最新数据 并竖表横排成一个视图
------解决方案--------------------drop table tbtest
go
create table tbtest(帐号 varchar(10),时间 datetime,项目 varchar(10),分数 int)
insert into tbtest
select '01 ', '2007-4-4 10:10:11 ', '01 ',5
union all select '01 ', '2007-4-4 10:11:11 ', '02 ',14
union all select '01 ', '2007-4-4 10:13:11 ', '01 ',7
union all select '02 ', '2007-4-4 10:14:11 ', '01 ',6
go
create proc up_test
as
declare @sql varchar(8000)
set @sql= ' '
select @sql=@sql+ ',max(case when 项目= ' ' '+项目+ ' ' ' then 分数 else 0 end) as ' '项目 '+rtrim(cast(项目 as int))+ ' ' ' '
from(select distinct 项目 from tbtest)t
exec( 'select 帐号,convert(char(10),时间,120) as ' '时间 ' ' '+@sql+ ' from (select * from tbtest
where 时间=(select max(时间) from tbtest a where a.帐号=tbtest.帐号 and a.项目=tbtest.项目))t group by 帐号,convert(char(10),时间,120) ')
go
/*
帐号 时间 项目1 项目2
---------- ---------- ----------- -----------
01 2007-04-04 7 14
02 2007-04-04 6 0
*/
------解决方案--------------------CREATE TABLE TB
(
帐号 VARCHAR(2),
时间 DATETIME,
项目 VARCHAR(2),
分数 INT
)
INSERT INTO TB
SELECT '01 ', '2007-4-4 10:10:11 ', '01 ',5 UNION ALL
SELECT '01 ', '2007-4-4 10:11:11 ', '02 ',14 UNION ALL
SELECT '01 ', '2007-4-4 10:13:11 ', '01 ',7 UNION ALL
SELECT '02 ', '2007-4-4 10:14:11 ', '01 ',6
GO
DECLARE @S VARCHAR(500)
SET @S= 'SELECT 帐号,MIN(CONVERT(CHAR(10),时间,120)) 时间, '
SELECT @S=@S+ 'MAX(CASE 项目 WHEN ' ' '+项目+ ' ' ' THEN 分数 ELSE 0 END) AS ' ' '+项目+ ' ' ', ' FROM (SELECT DISTINCT 项目 FROM TB ) A
SET @S=STUFF(@S,LEN(@S),1, ' ')+ ' FROM TB GROUP BY 帐号 '
exec( @S)
--结果
帐号 时间 01 02
---- ---------- ----------- -----------
01 2007-04-04 7 14
02 2007-04-04 6 0
(2 行受影响)