上一问链接http://topic.csdn.net/u/20111121/09/f1ff65c0-8b89-4e0b-8c36-6aa78a7cf979.html
可以实现多行值转为列显示,现在遇到一个新的问题,就是出现同一时间有多条数据,想把数据先取平均值后再列显示,请高手指点。
ID NAME TIME TEM HUM
01 张三 2011-10-11 20 21
02 李四 2011-10-11 19 18
03 张三 2011-10-11 19 20
04 李四 2011-10-11 18 19
05 张三 2011-10-12 22 20
06 李四 2011-10-12 19 15
||
张三 李四
2011-10-11 19.5(TEM) 18.5(TEM)
2011-10-12 22(TEM) 19(TEM)
可以实现多行值转为列显示,现在遇到一个新的问题,就是出现同一时间有多条数据,想把数据先取平均值后再列显示,请高手指点。
ID NAME TIME TEM HUM
01 张三 2011-10-11 20 21
02 李四 2011-10-11 19 18
03 张三 2011-10-11 19 20
04 李四 2011-10-11 18 19
05 张三 2011-10-12 22 20
06 李四 2011-10-12 19 15
||
张三 李四
2011-10-11 19.5(TEM) 18.5(TEM)
2011-10-12 22(TEM) 19(TEM)
avg(case when name = '李四' then tem else '' end) as '李四'
from record group by time
不过查询出来的数据是
time 张三 李四
2011-10-11 19.5 0
2011-10-11 0 18.5
2011-10-12 22 19请问我哪个地方写错了?
select convert(varchar(10),time,120) time,
avg(case when name = '张三' then tem else 0 end) as '张三',
avg(case when name = '李四' then tem else 0 end) as '李四'
from record
group by convert(varchar(10),time,120)
try !
go
--> -->
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([ID] nvarchar(2),[NAME] nvarchar(2),[TIME] Datetime,[TEM] int,[HUM] int)
Insert #T
select N'01',N'张三','2011-10-11',20,21 union all
select N'02',N'李四','2011-10-11',19,18 union all
select N'03',N'张三','2011-10-11',19,20 union all
select N'04',N'李四','2011-10-11',18,19 union all
select N'05',N'张三','2011-10-12',22,20 union all
select N'06',N'李四','2011-10-12',19,15
Godeclare @s nvarchar(4000)
set @s=''
Select @s=@s+N','+quotename(NAME)+N'=max(case when NAME=N'+quotename(NAME,'''')+N' then [TEM] else 0 end)'
from #T group by NAME
--顯示生成語句
print N'select TIME'+@s+N' from (SELECT [TIME],[NAME],cast(AVG([TEM]*1.0) as decimal(18,2)) AS [TEM] FROM #T GROUP BY [NAME],[TIME]) as a group by TIME'exec(N'select TIME'+@s+N' from (SELECT [TIME],[NAME],cast(AVG([TEM]*1.0) as decimal(18,2)) AS [TEM]FROM #T GROUP BY [NAME],[TIME]) as a group by TIME')go/*
TIME 李四 张三
2011-10-11 00:00:00.000 18.50 19.50
2011-10-12 00:00:00.000 19.00 22.00
*/
set @sql = 'select CONVERT(varchar(10),time,120) as time '
select @sql = @sql + ' , avg(case name when ''' + name + ''' then ltrim(tem)+''(tem)'' else '''' end) [' + name + ']'
from (select distinct name from tb) as a
set @sql = @sql + ' from tb group by CONVERT(varchar(10),time,120)'
exec(@sql)
if object_id('record','U') is not null
drop table record
go
CREATE TABLE [dbo].[record](
[id] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[name] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[time] [datetime] NULL,
[temperature] [float] NULL,
[humidity] [float] NULL
)
go
insert into record
select '01','张三','2011-10-11',20,21 union all
select '02','李四','2011-10-11',19,18 union all
select '03','张三','2011-10-11',19,20 union all
select '04','李四','2011-10-11',18,19 union all
select '05','张三','2011-10-12',22,20 union all
select '06','李四','2011-10-12',19,15
go
--方法一固定列
select TIME,
[张三]=CAST(SUM(CASE WHEN NAME='张三' then temperature else 0 END)*1.0/SUM(CASE WHEN NAME='张三' then 1 else 0 END) AS VARCHAR)+'(TEM)',
[李四]=CAST(SUM(CASE WHEN NAME='李四' then temperature else 0 END)*1.0/SUM(CASE WHEN NAME='李四' then 1 else 0 END) AS VARCHAR)+'(TEM)'
FROM record group by TIME
GO
--方法二不固定列
declare @sql varchar(8000)
select @sql=isnull(@sql+',','')+'['+Name+']=CAST(SUM(CASE WHEN NAME='''+NAME+''' THEN temperature else 0 END)*1.0/SUM(CASE WHEN NAME='''+Name+''' then 1 else 0 end) AS VARCHAR)+''(TEM)''' FROM (select distinct Name from record)a
exec('select Time,'+@sql+' from record group by time')
/*
Time 李四 张三
----------------------- ----------------------------------- -----------------------------------
2011-10-11 00:00:00.000 18.5(TEM) 19.5(TEM)
2011-10-12 00:00:00.000 19(TEM) 22(TEM)(2 行受影响)*/楼主要的不是avg,得用sum的值除以记录数
有時分秒時這樣用--顯示生成語句這一段可以看到生成的語句use Tempdb
go
--> -->
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([ID] nvarchar(2),[NAME] nvarchar(2),[TIME] Datetime,[TEM] int,[HUM] int)
Insert #T
select N'01',N'张三','2011-10-11',20,21 union all
select N'02',N'李四','2011-10-11',19,18 union all
select N'03',N'张三','2011-10-11',19,20 union all
select N'04',N'李四','2011-10-11',18,19 union all
select N'05',N'张三','2011-10-12',22,20 union all
select N'06',N'李四','2011-10-12',19,15
Godeclare @s nvarchar(4000)
set @s=''
Select @s=@s+N','+quotename(NAME)+N'=max(case when NAME=N'+quotename(NAME,'''')+N' then [TEM] else 0 end)'
from #T group by NAME
--顯示生成語句
print N'select TIME'+@s+N' from (SELECT [TIME]=convert(varchar(10),TIME,120),[NAME],cast(AVG([TEM]*1.0) as decimal(18,2)) AS [TEM] FROM #T GROUP BY [NAME],[TIME]) as a group by TIME'exec(N'select TIME'+@s+N' from (SELECT [TIME]=convert(varchar(10),TIME,120),[NAME],cast(AVG([TEM]*1.0) as decimal(18,2)) AS [TEM]FROM #T GROUP BY [NAME],[TIME]) as a group by TIME')GO
/*
TIME 李四 张三
2011-10-11 18.50 19.50
2011-10-12 19.00 22.00
*/
select time,avg(case name when '张三' then tem end) as '张三',
avg(case name when '李四' then tem end) as '李四'
from record group by time order by time asc