一个问题,难倒无数英雄啊... 80jking1989]

发布时间:2014-1-1 0:09:47
来源:分享查询网

实现日统计:选择日期,UserID,InterfaceID,动态实现统计选择时期内每个小时的上行总数、状态同步统计、成功率统计。如: 用户<select><item>UserID</item></select> 通道<select><item>InterfaceID</item></select> 日期:自己用插件或脚本实现均可(如从2010-5-1 到 2010-5-1,即2010-5-1当天) 表格: 同步数     10   25     。。。。 上行数     10     28     。。。。 成功率    100%   89.3%   。。。。 时间      0点     1点    2点 。。。 数据库字段 表和主要字段: T_User 用户表:ID,UserName,password... T_Mo 上行表:InterfaceID(通道) UserID RegDate(日期) T_Report 状态同步表(status=1表示成功):UserID,InterfaceID,Status,RegDate  给点思路啊 谢了!

英雄啊,犀利啊,我也想知道

表示木看明白

不是很明白

成功率 =   状态同步成功数/上行数 这个是想要的效果: 用户<select><item>UserID</item></select> 通道<select><item>InterfaceID</item></select> 日期:自己用插件或脚本实现均可(如从2010-5-1 到 2010-5-1,即2010-5-1当天) 表格: 同步数          上行数    成功率     时间   10                10             100%      0点    25                  28         89.3%       1点  比如说1点,那这个上行数就是上行表在1点的时候,同一个用户,同一个通道,的总数有多少,同步数也类似

CREATE     PROCEDURE [dbo].[Total_pag]      @UserID  int,--用户ID     @InterfaceID   int,--通道ID     @Start_Times  datetime,     @End_Times datetime,     @style int AS  declare   @times1 int declare   @times2 int declare   @Up_sum int declare   @Stau_sum int if @style =1 begin select count(DATEPART(HH,RegDate)) as Up_sum,DATEPART(HH,RegDate) as TR  into #T_Mo from dbo.T_Mo where RegDate between  @Start_Times and @End_Times and UserID=@UserID and InterfaceID=@InterfaceID GROUP BY DATEPART(HH,RegDate) order by DATEPART(HH,RegDate) desc select count(DATEPART(HH,RegDate)) as Stau_sum,DATEPART(HH,RegDate) as RR into #T_Report from dbo.T_Report where RegDate between  @Start_Times and @End_Times and UserID=@UserID and InterfaceID=@InterfaceID and  Status=1  GROUP BY DATEPART(HH,RegDate) order by DATEPART(HH,RegDate) desc select *,LTRIM(CONVERT(DEC(18,2),Stau_sum*100.0/Up_sum))+'%' as sty into ##Total from #T_Mo inner join #T_Report on #T_Mo.TR=#T_Report.RR end  if @style =2 begin     select count(DATEPART(dd,RegDate)) as Up_sum, DATEPART(dd,RegDate) as Mre_Date into #T_Mo from dbo.T_Mo where RegDate between  @Start_Times and @End_Times and UserID=@UserID and InterfaceID=@InterfaceID GROUP BY DATEPART(dd,RegDate) order by DATEPART(dd,RegDate) desc select count(DATEPART(dd,RegDate)) as Stau_sum,DATEPART(dd,RegDate) as Rre_Date into #T_Report from dbo.T_Report where RegDate between  @Start_Times and @End_Times and UserID=@UserID and InterfaceID=@InterfaceID and  Status=1  GROUP BY DATEPART(dd,RegDate) order by DATEPART(dd,RegDate) desc select *,LTRIM(CONVERT(DEC(18,2),Stau_sum*100.0/Up_sum))+'%' as sty into ##Total from #T_Mo inner join #T_Report on #T_Mo.Mre_Date=#T_Report.Rre_Date  end if @style =3 begin select count(UserID) as Up_sum,UserID into #T_Mo from T_Mo where InterfaceID=@InterfaceID and RegDate between  @Start_Times and @End_Times group by UserID order by UserID select count(UserID) as Stau_sum,UserID as U_ID into #T_Report from T_Report where InterfaceID=@InterfaceID and RegDate between  @Start_Times and @End_Times and  Status=1  group by UserID order by UserID select *,LTRIM(CONVERT(DEC(18,2),Stau_sum*100.0/Up_sum))+'%' as sty into ##Total from #T_Mo inner join #T_Report on #T_Mo.UserID=#T_Report.U_ID  end drop table #T_Mo drop table #T_Report drop table ##Total 我的想法是字段在数据库里面构造,然后放在一张临时表,程序读出临时表,但是,我这个代码有错啊, 消息 2714,级别 16,状态 1,过程 Total_pag,第 29 行 数据库中已存在名为 '#T_Mo' 的对象。 消息 2714,级别 16,状态 1,过程 Total_pag,第 30 行 数据库中已存在名为 '#T_Report' 的对象。 消息 2714,级别 16,状态 1,过程 Total_pag,第 32 行 数据库中已存在名为 '##Total' 的对象。 消息 2714,级别 16,状态 1,过程 Total_pag,第 39 行 数据库中已存在名为 '#T_Mo' 的对象。 消息 2714,级别 16,状态 1,过程 Total_pag,第 40 行 数据库中已存在名为 '#T_Report' 的对象。 消息 2714,级别 16,状态 1,过程 Total_pag,第 42 行 数据库中已存在名为 '##Total' 的对象。

我想我大概明白了一点,你的意思想从T_Mo 上行表和T_Report 状态同步表中的数据得到你想要的结果,不知道有木有理解错误

没错 就是要的数据是要从数据库里原有的数据进行统计后得出的 而数据库的数据又是相当的大

顶死清

顶。。。建

迫切想知道这个答案,哎,高人回答吧

create table #T_User ([ID] int identity(1,1) not null primary key, [UserName] varchar(20) default '', [Password] varchar(20) default '') create table #T_Mo (InterfaceID int not null primary key,UserID int default 0, RegDate datetime default getdate()) create table #T_Report ([ID] int identity(1,1) not null primary key, UserId int default 0, InterfaceID int default 0, Status int, RegDate datetime) insert into #T_User(UserName, Password)  select 'A','A' union All select 'B','B' union All select 'C','C' union All select 'D','D' union All select 'E','E' union All select 'F','F' union All select 'G','G' union All select 'H','H' Go declare @i int set @i = 1 while @i < 100  begin   Insert Into #T_Mo   select @i, (select top 1 [ID] from #T_User order by newid()), getdate()   set @i = @i + 1 end declare @i int set @i = 1 while @i < 100  begin   Insert Into #T_Report   select (select top 1 [ID] from #T_User order by newid()), (select top 1 [InterfaceID] from #T_Mo order by newid()), 1, getdate()   set @i = @i + 1 end select * from #T_Mo select * from #T_Report Update #T_Mo set RegDate = Dateadd(hh, 1, RegDate) where InterfaceID between 0 and 10 Update #T_Mo set RegDate = Dateadd(hh, 2, RegDate) where InterfaceID between 11 and 31 Update #T_Mo set RegDate = Dateadd(hh, 3, RegDate) where InterfaceID between 32 and 60 Update #T_Mo set RegDate = Dateadd(hh, 4, RegDate) where InterfaceID between 61 and 100 Update #T_Report set RegDate = Dateadd(hh, 1, RegDate) where [ID] between 0 and 10 Update #T_Report set RegDate = Dateadd(hh, 2, RegDate) where [ID] between 11 and 30 Update #T_Report set RegDate = Dateadd(hh, 3, RegDate) where [ID] between 32 and 56 Update #T_Report set RegDate = Dateadd(hh, 4, RegDate) where [ID] between 61 and 100 select Year(RegDate) iYear, Month(RegDate) iMonth, Day(RegDate) iDay, (substring(convert(varchar(20),RegDate, 121),12,2)) iHour, Count(1) iCount into #T_Mo1 from #T_Mo group by  RegDate select Year(RegDate) iYear, Month(RegDate) iMonth, Day(RegDate) iDay, (substring(convert(varchar(20),RegDate, 121),12,2)) iHour, Count(1) iCount into #T_Report1 from #T_Report group by  RegDate select A.iCount iMoCount, B.iCount iRptCount, Round(((B.iCount*0.1) / (A.iCount*0.1)), 2) fRate, A.iHour from  #T_Mo1 A inner join #T_Report1 B on A.iYear=B.iYear and A.iMonth=B.iMonth and A.iDay=B.iDay and A.iHour=B.iHour 都不知道是不是这样的,也就糊里糊涂的写了个,你们看看

create table #T_User ([ID] int identity(1,1) not null primary key, [UserName] varchar(20) default '', [Password] varchar(20) default '') create table #T_Mo (InterfaceID int not null primary key,UserID int default 0, RegDate datetime default getdate()) create table #T_Report ([ID] int identity(1,1) not null primary key, UserId int default 0, InterfaceID int default 0, Status int, RegDate datetime) /* --加入测试数据 insert into #T_User(UserName, Password)  select 'A','A' union All select 'B','B' union All select 'C','C' union All select 'D','D' union All select 'E','E' union All select 'F','F' union All select 'G','G' union All select 'H','H' Go declare @i int set @i = 1 while @i < 100  begin   Insert Into #T_Mo   select @i, (select top 1 [ID] from #T_User order by newid()), getdate()   set @i = @i + 1 end declare @i int set @i = 1 while @i < 100  begin   Insert Into #T_Report   select (select top 1 [ID] from #T_User order by newid()), (select top 1 [InterfaceID] from #T_Mo order by newid()), 1, getdate()   set @i = @i + 1 end select * from #T_Mo select * from #T_Report Update #T_Mo set RegDate = Dateadd(hh, 1, RegDate) where InterfaceID between 0 and 10 Update #T_Mo set RegDate = Dateadd(hh, 2, RegDate) where InterfaceID between 11 and 31 Update #T_Mo set RegDate = Dateadd(hh, 3, RegDate) where InterfaceID between 32 and 60 Update #T_Mo set RegDate = Dateadd(hh, 4, RegDate) where InterfaceID between 61 and 100 Update #T_Report set RegDate = Dateadd(hh, 1, RegDate) where [ID] between 0 and 10 Update #T_Report set RegDate = Dateadd(hh, 2, RegDate) where [ID] between 11 and 30 Update #T_Report set RegDate = Dateadd(hh, 3, RegDate) where [ID] between 32 and 56 Update #T_Report set RegDate = Dateadd(hh, 4, RegDate) where [ID] between 61 and 100 */ select Year(RegDate) iYear, Month(RegDate) iMonth, Day(RegDate) iDay, (substring(convert(varchar(20),RegDate, 121),12,2)) iHour, Count(1) iCount into #T_Mo1 from #T_Mo group by  RegDate select Year(RegDate) iYear, Month(RegDate) iMonth, Day(RegDate) iDay, (substring(convert(varchar(20),RegDate, 121),12,2)) iHour, Count(1) iCount into #T_Report1 from #T_Report group by  RegDate select A.iCount iMoCount, B.iCount iRptCount, Round(((B.iCount*0.1) / (A.iCount*0.1)), 2) fRate, A.iHour from  #T_Mo1 A inner join #T_Report1 B on A.iYear=B.iYear and A.iMonth=B.iMonth and A.iDay=B.iDay and A.iHour=B.iHour

没有看懂

引用 13 楼 fredrickhu 的回复:没有看懂的确!

顶,还是不行啊 我试了一下

那俺不清楚了,你们又表达不清楚,我只能大概猜测下你们所有的结果

我的理解是这样, 题目的目的是想做一个日统计: 根据上行表和同步状态表,统计出每天每小时的上行数量,同步状态成功数,还有成功率,然后在程序里面显示出来, 这个成功率计算是: 条件:同一个时间,同一个用户,同一个通道, 以上为条件的情况下统计上行表里面符合的有多少条,同步状态表(stustr=1)的有多少条, 然后相除就等 于成功率, lz的意思是后台构造出一个临时表,然后程序直接显示这个表就可以了,

引用 17 楼 yangzihao525 的回复:我的理解是这样, 题目的目的是想做一个日统计: 根据上行表和同步状态表,统计出每天每小时的上行数量,同步状态成功数,还有成功率,然后在程序里面显示出来, 这个成功率计算是: 条件:同一个时间,同一个用户,同一个通道, 以上为条件的情况下统计上行表里面符合的有多少条,同步状态表(stustr=1)的有多少条, 然后相除就等 于成功率, lz的意思是后台构造出一个临时表…… 这位朋友的想法跟我的意思很接近了 大概就是这样子 期待能解决

这个 问题 好像不会 难倒无数英雄 吧? 难道我没理解问题?? 【做了一个 数据字典工具 exe+doc:(说明非常简单,招募理解和表达能力好的人士帮着写说明) http://www.vdisk.cn/down/index/7830097A3608】

select UserID,InterfaceID,Year(RegDate) iYear, Month(RegDate) iMonth, Day(RegDate) iDay, (substring(convert(varchar(20),RegDate, 121),12,2)) iHour, Count(1) iCount into #T_Mo1 from #T_Mo group by  RegDate,UserID,InterfaceID select UserID,InterfaceID,Year(RegDate) iYear, Month(RegDate) iMonth, Day(RegDate) iDay, (substring(convert(varchar(20),RegDate, 121),12,2)) iHour, Count(1) iCount into #T_Report1 from #T_Report where Status=1 group by  RegDate,UserID,InterfaceID select A.UserID,A.InterfaceID,A.iCount iMoCount, B.iCount iRptCount      , convert(Decimal(18,2), (B.iCount*0.1) / (A.iCount*0.1)) fRate, A.iHour   from  #T_Mo1 A         inner join #T_Report1 B on A.UserID=B.UserID and A.InterfaceID=B.InterfaceID                                and A.iYear=B.iYear and A.iMonth=B.iMonth and A.iDay=B.iDay and A.iHour=B.iHour 把你所要的条件加进去不行吗,还是我的理解偏差了

数据库字段 表和主要字段: T_User 用户表:ID,UserName,password... T_Mo 上行表:InterfaceID(通道) UserID RegDate(日期) T_Report 状态同步表(status=1表示成功):UserID,InterfaceID,Status,RegDate 给出上面表的实际的一些数据,再给出想要的数据,这样别人容易明白

汗。还是自己想想怎么才能够把这个问题描述的清楚。这样提问可能事半功倍噢。否则再怎么问,别人要猜你的意图。太难了。

就是题目的目的是想做一个日统计: 根据上行表和同步状态表,统计出每天每小时的上行数量,同步状态成功数,还有成功率,然后在程序里面显示出来, 这个成功率计算是: 条件:同一个时间,同一个用户,同一个通道, 以上为条件的情况下统计上行表里面符合的有多少条,同步状态表(stustr=1)的有多少条, 然后相除就等 于成功率,然后想后台构造出一个临时表,然后程序直接显示这个表就可以了。 主要是这些表的数据量都很大(除用户表外每个表至少500w条) 我想说这样做效率会不会高点

select a.reportcount,a.interfaceid,a.reporthout,b.mocount from (select count(id) reportcount ,interfaceid,datepart(hh,regdate) reporthour from t_report where convert(varchar(10),regdate,111)='2010/05/01' and status=1 group by datepart(hh,regdate),interfaceid) a left join (select count(id) mocount ,interfaceid,datepart(hh,regdate) mohour from t_mo where convert(varchar(10),regdate,111)='2010/05/01'  group by datepart(hh,regdate),interfaceid) b on b.interfaceid=a.interfaceid and a.reporthour=b.mohour

建好索引后速度不会有问题的啊,不就500W嘛

不懂。。。

该回复于2011-05-19 15:33:00被版主删除

一点也看不懂

小伎俩,无非是骗人家给你干活。切!

返回顶部
查看电脑版