首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

紧急 看这样的有关问题能用一条sql语句解决吗

2012-03-25 
紧急! 看这样的问题能用一条sql语句解决吗?有这样的一个数据表fivemindatachanel_codefivemin_timefivemin

紧急! 看这样的问题能用一条sql语句解决吗?
有这样的一个数据表   fivemindata
  chanel_code               fivemin_time                     fivemin_max               fivemin_ave
 
            12007-1-10   00:05:00               3.68           2.24
            12007-1-10   00:10:00               3.67           2.25
            12007-1-10   00:15:00               3.59           2.37
            12007-1-10   00:20:00               3.64           2.46
            12007-1-10   00:25:00               3.42           2.13
            12007-1-10   00:30:00             3.27           2.34
            12007-1-10   00:35:00             3.29           2.28
            12007-1-10   00:40:00             3.16           2.27
            12007-1-10   00:45:00             3.33           2.28
            1                       2007-1-10   00:50:00             3.34           2.25
            12007-1-10   00:55:00             3.26           2.73
            12007-1-10   01:00:00             3.49           2.27
            12007-1-10   01:05:00             3.57           2.57  
            12007-1-10   01:10:00             3.24           2.56
            12007-1-10   01:15:00             3.68           2.25
            12007-1-10   01:20:00             3.58           2.32
            12007-1-10   01:25:00             3.42           2.17
            12007-1-10   01:30:00             3.24           2.28
            12007-1-10   01:35:00             3.16           2.28
            12007-1-10   01:40:00             3.35           2.25
            12007-1-10   01:45:00             3.26           2.74


            12007-1-10   01:50:00             3.45                           2.35
            12007-1-10   01:55:00             3.27           2.73
            12007-1-10   02:00:00             3.26           2.74
            2                       2007-1-10   00:00:00             3.45                           2.33          
            .
            .
当然有许多chanel_code,时间是每5分钟增加一次,后面是所对应的在这5分钟内的最大值和平均值。
想要得到某一天(2007-1-10)这样的记录。

时\分   :05     :10     :15     :20     :25     :30     :35     :40   :45     :50     :55       :60
    00     3.68   3.67   3.59   3.64   3.42   3.27   3.29   3.16   3.33   3.34     3.26     3.49
    01     3.57   3.24   3.68   3.58   3.42   3.24   3.16   3.35   3.26   3.45     3.27     3.26
    02             ...           ...
    03             ...           ...
    04             ...           ...
    ..             ...           ...  
    ..             ...           ...
    23             ...           ...


[解决办法]
--至于你60应该算在哪里?你自己写.
if object_id( 'pubs..tb ') is not null
drop table tb
go

create table tb(chanel_code int,fivemin_time datetime,fivemin_max decimal(18,2),fivemin_ave decimal(18,2))
insert into tb(chanel_code,fivemin_time,fivemin_max,fivemin_ave) values(1, '2007-1-10 00:05:00 ',3.68, 2.24)
insert into tb(chanel_code,fivemin_time,fivemin_max,fivemin_ave) values(1, '2007-1-10 00:10:00 ',3.67, 2.25)
insert into tb(chanel_code,fivemin_time,fivemin_max,fivemin_ave) values(1, '2007-1-10 00:15:00 ',3.59, 2.37)
insert into tb(chanel_code,fivemin_time,fivemin_max,fivemin_ave) values(1, '2007-1-10 00:20:00 ',3.64, 2.46)
insert into tb(chanel_code,fivemin_time,fivemin_max,fivemin_ave) values(1, '2007-1-10 00:25:00 ',3.42, 2.13)
insert into tb(chanel_code,fivemin_time,fivemin_max,fivemin_ave) values(1, '2007-1-10 00:30:00 ',3.27, 2.34)
insert into tb(chanel_code,fivemin_time,fivemin_max,fivemin_ave) values(1, '2007-1-10 00:35:00 ',3.29, 2.28)
insert into tb(chanel_code,fivemin_time,fivemin_max,fivemin_ave) values(1, '2007-1-10 00:40:00 ',3.16, 2.27)
insert into tb(chanel_code,fivemin_time,fivemin_max,fivemin_ave) values(1, '2007-1-10 00:50:00 ',3.34, 2.25)
insert into tb(chanel_code,fivemin_time,fivemin_max,fivemin_ave) values(1, '2007-1-10 00:55:00 ',3.26, 2.73)


insert into tb(chanel_code,fivemin_time,fivemin_max,fivemin_ave) values(1, '2007-1-10 01:00:00 ',3.49, 2.27)
insert into tb(chanel_code,fivemin_time,fivemin_max,fivemin_ave) values(1, '2007-1-10 01:05:00 ',3.57, 2.57)
insert into tb(chanel_code,fivemin_time,fivemin_max,fivemin_ave) values(1, '2007-1-10 01:10:00 ',3.24, 2.56)
insert into tb(chanel_code,fivemin_time,fivemin_max,fivemin_ave) values(1, '2007-1-10 01:15:00 ',3.68, 2.25)
insert into tb(chanel_code,fivemin_time,fivemin_max,fivemin_ave) values(1, '2007-1-10 01:20:00 ',3.58, 2.32)
insert into tb(chanel_code,fivemin_time,fivemin_max,fivemin_ave) values(1, '2007-1-10 01:25:00 ',3.42, 2.17)
insert into tb(chanel_code,fivemin_time,fivemin_max,fivemin_ave) values(1, '2007-1-10 01:30:00 ',3.24, 2.28)
insert into tb(chanel_code,fivemin_time,fivemin_max,fivemin_ave) values(1, '2007-1-10 01:35:00 ',3.16, 2.28)
insert into tb(chanel_code,fivemin_time,fivemin_max,fivemin_ave) values(1, '2007-1-10 01:40:00 ',3.35, 2.25)
insert into tb(chanel_code,fivemin_time,fivemin_max,fivemin_ave) values(1, '2007-1-10 01:45:00 ',3.26, 2.74)
insert into tb(chanel_code,fivemin_time,fivemin_max,fivemin_ave) values(1, '2007-1-10 01:50:00 ',3.45,2.35)
insert into tb(chanel_code,fivemin_time,fivemin_max,fivemin_ave) values(1, '2007-1-10 01:55:00 ',3.27, 2.73)
insert into tb(chanel_code,fivemin_time,fivemin_max,fivemin_ave) values(1, '2007-1-10 02:00:00 ',3.26, 2.74)
insert into tb(chanel_code,fivemin_time,fivemin_max,fivemin_ave) values(2, '2007-1-10 00:00:00 ',3.45,2.33)
go

select convert(varchar(10),fivemin_time,120) as 日期 , substring(convert(varchar(13),fivemin_time,120),12,2) as 小时,
max(case when datediff(minute , cast(convert(varchar(13),fivemin_time,120)+ ':00:00 ' as datetime),fivemin_time) = 5 then fivemin_max else 0 end) as ':05 ',
max(case when datediff(minute , cast(convert(varchar(13),fivemin_time,120)+ ':00:00 ' as datetime),fivemin_time) = 10 then fivemin_max else 0 end) as ':10 ',
max(case when datediff(minute , cast(convert(varchar(13),fivemin_time,120)+ ':00:00 ' as datetime),fivemin_time) = 15 then fivemin_max else 0 end) as ':15 ',
max(case when datediff(minute , cast(convert(varchar(13),fivemin_time,120)+ ':00:00 ' as datetime),fivemin_time) = 20 then fivemin_max else 0 end) as ':20 ',
max(case when datediff(minute , cast(convert(varchar(13),fivemin_time,120)+ ':00:00 ' as datetime),fivemin_time) = 25 then fivemin_max else 0 end) as ':25 ',
max(case when datediff(minute , cast(convert(varchar(13),fivemin_time,120)+ ':00:00 ' as datetime),fivemin_time) = 30 then fivemin_max else 0 end) as ':30 ',
max(case when datediff(minute , cast(convert(varchar(13),fivemin_time,120)+ ':00:00 ' as datetime),fivemin_time) = 35 then fivemin_max else 0 end) as ':35 ',
max(case when datediff(minute , cast(convert(varchar(13),fivemin_time,120)+ ':00:00 ' as datetime),fivemin_time) = 40 then fivemin_max else 0 end) as ':40 ',
max(case when datediff(minute , cast(convert(varchar(13),fivemin_time,120)+ ':00:00 ' as datetime),fivemin_time) = 45 then fivemin_max else 0 end) as ':45 ',
max(case when datediff(minute , cast(convert(varchar(13),fivemin_time,120)+ ':00:00 ' as datetime),fivemin_time) = 50 then fivemin_max else 0 end) as ':50 ',
max(case when datediff(minute , cast(convert(varchar(13),fivemin_time,120)+ ':00:00 ' as datetime),fivemin_time) = 55 then fivemin_max else 0 end) as ':55 '
from tb
group by convert(varchar(10),fivemin_time,120) , substring(convert(varchar(13),fivemin_time,120),12,2)



drop table tb

/*
日期 小时 :05 :10 :15 :20 :25 :30 :35 :40 :45 :50 :55
---------- ---- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- --------------------
2007-01-10 00 3.68 3.67 3.59 3.64 3.42 3.27 3.29 3.16 .00 3.34 3.26
2007-01-10 01 3.57 3.24 3.68 3.58 3.42 3.24 3.16 3.35 3.26 3.45 3.27
2007-01-10 02 .00 .00 .00 .00 .00 .00 .00 .00 .00 .00 .00

(所影响的行数为 3 行)
*/

[解决办法]
加max并不是为了求最大值
而是语法的需要:因为用到了分组,那么只有分组依据列和出现在聚合函数里面的列才能出现在
select 后面的字段列表了
如果不用max,这条语句就不能执行了
[解决办法]
这只是个打横的操作而已,其实不建议写成二楼中的静太方法的。最好能写成动态的。。

不想改了。

/* 使用方法
EXEC sp_tmp 'vwSDorderCSBDDtl ', 'sColorName ',
'sSizeName ', 'iQty ',
'E79DD28A-410E-43B7-8153-7C42D5E9A803 ',
'WHERE sProductNo = ' ' ' 'DCH060008 ' ' ' ' '
*/
ALTER PROCEDURE dbo.sp_TransDisplayColorSizeQty
(
@sTableName sysname, --表名
@sColorNameField varchar(1000), --颜色
@sSizeNameField varchar(1000), --尺码
@sValueNameField varchar(1000), --值
@SizeGroupGUID uniqueidentifier, --尺码组GUID
@sWhere varchar(1000) --条件
)
AS
DECLARE @sExeSQL varchar(8000)

SELECT @sExeSQL = '
DECLARE @sSQL varchar(8000)
SET @sSQL = ' 'SELECT '+@sColorNameField+ ', ' '
SELECT @sSQL = @sSQL + ' 'SUM(CASE '+@sSizeNameField+ '
WHEN ' ' ' ' ' '+ '+@sSizeNameField+ '+ ' ' ' ' ' ' THEN '+@sValueNameField+ ' ELSE 0 END) AS ' ' ' ' ' '+ '+@sSizeNameField+ '+ ' ' ' ' ' ', ' '
FROM (
SELECT DISTINCT TOP 100 PERCENT b.iID, '+@sSizeNameField+ '
FROM '+@sTableName+ ' AS a
LEFT JOIN vwSize b ON a.SizeGUID = b.GUID
WHERE b.SizeGroupGUID = ' ' '+CAST(@SizeGroupGUID AS VARCHAR(36))+ ' ' '
ORDER BY b.iID, '+@sSizeNameField+ '
) a
SELECT @sSQL = LEFT (@sSQL, len(@sSQL) - 1) + ' '
FROM '+@sTableName+ '
'+@sWhere+ '
GROUP BY '+@sColorNameField+ ' ' '
EXEC(@sSQL) '
--SELECT @sSQL AS sSQL
EXEC(@sExeSQL)
--SELECT @sExeSQL AS sExeSQL


[解决办法]
我只是给了个方法,至于你具体的算法,得自己写了.
加MAX是为了语法的需要,在这里用MIN也行.

另:因你的内容不多,:05 :10 :15 :20 :25 :30 :35 :40 :45 :50 :55 :60,所以写成了静态的.如果要动态的,请参阅下面的SQL.

普通行列转换

假设有张学生成绩表(t)如下

Name Subject Result
张三 语文  73
张三 数学  83
张三 物理  93


李四 语文  74
李四 数学  84
李四 物理  94

想变成
姓名 语文 数学 物理
张三 73  83  93
李四 74  84  94

create table #t
(
Name varchar(10) ,
Subject varchar(10) ,
Result int
)

insert into #t(Name , Subject , Result) values( '张三 ', '语文 ', '73 ')
insert into #t(Name , Subject , Result) values( '张三 ', '数学 ', '83 ')
insert into #t(Name , Subject , Result) values( '张三 ', '物理 ', '93 ')
insert into #t(Name , Subject , Result) values( '李四 ', '语文 ', '74 ')
insert into #t(Name , Subject , Result) values( '李四 ', '数学 ', '83 ')
insert into #t(Name , Subject , Result) values( '李四 ', '物理 ', '93 ')

declare @sql varchar(8000)
set @sql = 'select Name as ' + '姓名 '
select @sql = @sql + ' , sum(case Subject when ' ' ' + Subject + ' ' ' then Result end) [ ' + Subject + '] '
from (select distinct Subject from #t) as a
set @sql = @sql + ' from #t group by name '
exec(@sql)

drop table #t

--结果
姓名 数学 物理 语文
---------- ----------- ----------- -----------
李四 83 93 74
张三 83 93 73

热点排行