做报表时用的存储和计划任务,留个备份。

由于查询的数据量很大,所以写了好几个:

USE [SGPS_SZ]
GO
/****** Object:  StoredProcedure [dbo].[spMileageStatement]    Script Date: 07/19/2012 13:39:32 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:        <Author,,YangSongKai>
-- Create date: <Create 2012-07-02,,>
-- Description:    <Description,,里程报表>
-- =============================================

ALTER PROCEDURE [dbo].[spMileageStatement](
 @CarNo varchar(30),--车牌号
 @CompanyId varchar(100),--驾校id
 @StartDay varchar(20),--开始日期(年月日)
 @EndDay varchar(20),--结束日期
 @StartTime varchar(20),--开始时间(时分秒)
 @EndTime varchar(20)--结束时间
    )
AS

--自定义变量
declare @result int--日期相差多少天
declare @S datetime--开始时间
declare @E datetime--结束时间
declare @GpsPath varchar(30)--表名
declare @number int--循环种子
declare @WHERES VARCHAR(1000)
declare @SQL VARCHAR(3000)
declare @t varchar(20)
set @S=CONVERT(Datetime,@StartDay+@StartTime)
set @E=CONVERT(Datetime,@StartDay+@EndTime)
--set @GpsPath='dbo.GpsPath'+CONVERT( VARCHAR(8), CAST(FLOOR(CAST(@S AS FLOAT)) AS DATETIME), 112)
set @number=0
set @result=DATEDIFF (d,CONVERT(Datetime,@StartDay),CONVERT(Datetime,@EndDay))

create TABLE #temptb    
(   
    TerminalNo varchar(20),
    CarNo varchar(20),
    CompanyName varchar(50),
    Mileage decimal(18,2)
)
 
declare @begin_date datetime declare @end_date datetime select @begin_date = getdate() 
    while(@number<=@result)
    begin
    set @GpsPath='dbo.GpsPath'+CONVERT( VARCHAR(8), CAST(FLOOR(CAST(@S AS FLOAT)) AS DATETIME), 112)
    IF(@CarNo='' or @CarNo is null)
    SET @WHERES=' AND dbo.Company.CompanyId='''+@CompanyId+''' and GpsTime between '''+CONVERT(VARCHAR(19),@S,120)+''' and '''+CONVERT(VARCHAR(19),@E,120)+''''
    --ELSE
    --begin
    --set @t=(select TerminalNo from Terminal where CarId=(select CarId from Car where CarNo=@CarNo))
   -- set @WHERES=' and GpsTime between '''+CONVERT(VARCHAR(19),@S,120)+''' and '''+CONVERT(VARCHAR(19),@E,120)+''' and dbo.Terminal.TerminalNo='''+@t+''''
    --end
    --循环查出数据集插入到临时表中
    SET @SQL='insert into #temptb(TerminalNo,CarNo,CompanyName,Mileage)(SELECT TerminalNo,CarNo,CompanyName,
(SELECT  top 1 Mileage 
FROM  dbo.Car 
INNER JOIN dbo.Terminal ON dbo.Car.CarId = dbo.Terminal.CarId 
INNER JOIN '+@GpsPath+' ON dbo.Terminal.TerminalNo = '+@GpsPath+'.TerminalNo
WHERE GpsTime<='''+CONVERT(VARCHAR(19),@E,120)+''' AND Terminal.TerminalNo=T.TerminalNo AND Mileage>0
ORDER BY GpsTime desc )-(SELECT  top 1 Mileage
FROM  dbo.Car 
INNER JOIN dbo.Terminal ON dbo.Car.CarId = dbo.Terminal.CarId 
INNER JOIN '+@GpsPath+' ON dbo.Terminal.TerminalNo = '+@GpsPath+'.TerminalNo AND Mileage>0
WHERE GpsTime>='''+CONVERT(VARCHAR(19),@S,120)+''' AND Terminal.TerminalNo=T.TerminalNo
ORDER BY GpsTime asc)AS    Mileage
FROM
(SELECT '+@GpsPath+'.TerminalNo, MIN(GpsTime)AS StartTime,MAX(GpsTime)AS EndTime,CarNo,CompanyName
from '+@GpsPath+'
inner join dbo.Terminal on '+@GpsPath+'.TerminalNo=dbo.Terminal.TerminalNo
inner join dbo.Car on dbo.Terminal.CarId=dbo.Car.CarId
inner join dbo.Company on dbo.Car.CompanyId=dbo.Company.CompanyId 
 WHERE 1=1 '+@WHERES+'
group by '+@GpsPath+'.TerminalNo,CarNo,CompanyName)T)'
    Exec(@SQL) 
    set @number=@number+1
    set @S=DATEADD(d,1,@S)
    set @E=DATEADD(d,1,@E)
    end
select ROW_NUMBER() Over(order by CompanyName desc) as rowId, TerminalNo,CarNo,CompanyName,SUM(Mileage)as Mileage from #temptb group by TerminalNo,CarNo,CompanyName 
if object_id('tempdb..#emptb')>0
drop table #temptb
select @end_date = getdate() select datediff(ms,@begin_date,@end_date) as '用时/毫秒'

2.

USE [SGPS_SZ]
GO
/****** Object:  StoredProcedure [dbo].[spMileageStatement]    Script Date: 07/19/2012 13:39:32 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:        <Author,,YangSongKai>
-- Create date: <Create 2012-07-02,,>
-- Description:    <Description,,里程报表>
-- =============================================

ALTER PROCEDURE [dbo].[spMileageStatement](
 @CarNo varchar(30),--车牌号
 @CompanyId varchar(100),--驾校id
 @StartDay varchar(20),--开始日期(年月日)
 @EndDay varchar(20),--结束日期
 @StartTime varchar(20),--开始时间(时分秒)
 @EndTime varchar(20)--结束时间
    )
AS

--自定义变量
declare @result int--日期相差多少天
declare @S datetime--开始时间
declare @E datetime--结束时间
declare @GpsPath varchar(30)--表名
declare @number int--循环种子
declare @WHERES VARCHAR(1000)
declare @SQL VARCHAR(3000)
declare @t varchar(20)
set @S=CONVERT(Datetime,@StartDay+@StartTime)
set @E=CONVERT(Datetime,@StartDay+@EndTime)
--set @GpsPath='dbo.GpsPath'+CONVERT( VARCHAR(8), CAST(FLOOR(CAST(@S AS FLOAT)) AS DATETIME), 112)
set @number=0
set @result=DATEDIFF (d,CONVERT(Datetime,@StartDay),CONVERT(Datetime,@EndDay))

create TABLE #temptb    
(   
    TerminalNo varchar(20),
    CarNo varchar(20),
    Gpstime varchar(100),
    CompanyName varchar(50),
    Mileage decimal(18,2),
)

 
declare @begin_date datetime declare @end_date datetime select @begin_date = getdate() 
    while(@number<=@result)
    begin
    set @GpsPath='dbo.GpsPath'+CONVERT( VARCHAR(8), CAST(FLOOR(CAST(@S AS FLOAT)) AS DATETIME), 112)
    IF(@CarNo='' or @CarNo is null)
    SET @WHERES=' AND dbo.Company.CompanyId='''+@CompanyId+''' and GpsTime between '''+CONVERT(VARCHAR(19),@S,120)+''' and '''+CONVERT(VARCHAR(19),@E,120)+''''
    ELSE
    begin
    set @t=(select TerminalNo from Terminal where CarId=(select CarId from Car where CarNo=@CarNo))
    set @WHERES=' and GpsTime between '''+CONVERT(VARCHAR(19),@S,120)+''' and '''+CONVERT(VARCHAR(19),@E,120)+''' and dbo.Terminal.TerminalNo='''+@t+''''
    end
    --循环查出数据集插入到临时表中
    SET @SQL='insert into #temptb(TerminalNo,CarNo,Gpstime,CompanyName,Mileage)(SELECT '+@GpsPath+'.TerminalNo,CarNo,GpsTime,CompanyName,Mileage 
    from '+@GpsPath+'
    inner join dbo.Terminal on '+@GpsPath+'.TerminalNo=dbo.Terminal.TerminalNo
    inner join dbo.Car on dbo.Terminal.CarId=dbo.Car.CarId
    inner join dbo.Company on dbo.Car.CompanyId=dbo.Company.CompanyId 
     WHERE 1=1 '+@WHERES+'
    group by '+@GpsPath+'.TerminalNo,CarNo,GpsTime,CompanyName,dbo.Company.CompanyId,Mileage)'
    Exec(@SQL) 
    
    set @number=@number+1
    set @S=DATEADD(d,1,@S)
    set @E=DATEADD(d,1,@E)
    end


    select ROW_NUMBER() Over(order by CompanyName desc) as rowId,TerminalNo,CarNo,CompanyName,sum(Mileage) Mileage
    from(
        select TerminalNo,CarNo,CompanyName,convert(varchar(8),Gpstime,112) date,
               max(Mileage) - min(Mileage) mileage
        from #temptb
        group by TerminalNo,CarNo,CompanyName,convert(varchar(8),Gpstime,112)
    ) t
    group by TerminalNo,CarNo,CompanyName --order by TerminalNo asc
        
if object_id('tempdb..#emptb')>0
drop table #temptb



select @end_date = getdate() select datediff(ms,@begin_date,@end_date) as '用时/毫秒'

3.

USE [SGPS_SZ]
GO
/****** Object:  StoredProcedure [dbo].[spMileageStatement]    Script Date: 07/20/2012 08:54:08 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:        <Author,,YangSongKai>
-- Create date: <Create 2012-07-02,,>
-- Description:    <Description,,里程报表>
-- =============================================

ALTER PROCEDURE [dbo].[spMileageStatement](
 @CarNo varchar(30),--车牌号
 @CompanyId varchar(100),--驾校id
 @StartDay varchar(20),--开始日期(年月日)
 @EndDay varchar(20),--结束日期
 @StartTime varchar(20),--开始时间(时分秒)
 @EndTime varchar(20)--结束时间
    )
AS

--自定义变量
declare @result int--日期相差多少天
declare @S datetime--开始时间
declare @E datetime--结束时间
declare @GpsPath varchar(30)--表名
declare @number int--循环种子
declare @WHERES VARCHAR(1000)
declare @SQL VARCHAR(3000)
declare @t varchar(20)
set @S=CONVERT(Datetime,@StartDay+@StartTime)
set @E=CONVERT(Datetime,@StartDay+@EndTime)
--set @GpsPath='dbo.GpsPath'+CONVERT( VARCHAR(8), CAST(FLOOR(CAST(@S AS FLOAT)) AS DATETIME), 112)
set @number=0
set @result=DATEDIFF (d,CONVERT(Datetime,@StartDay),CONVERT(Datetime,@EndDay))

create TABLE #temptb    
(   
    TerminalNo varchar(20),
    CarNo varchar(20),
    Gpstime varchar(100),
    CompanyName varchar(50),
    Mileage decimal(18,2),
)

 
declare @begin_date datetime declare @end_date datetime select @begin_date = getdate() 
    while(@number<=@result)
    begin
    set @GpsPath='dbo.GpsPath'+CONVERT( VARCHAR(8), CAST(FLOOR(CAST(@S AS FLOAT)) AS DATETIME), 112)
    IF(@CarNo='' or @CarNo is null)
    --SET @WHERES=' AND dbo.Company.CompanyId='''+@CompanyId+''' and GpsTime between '''+CONVERT(VARCHAR(19),@S,120)+''' and '''+CONVERT(VARCHAR(19),@E,120)+''''
    SET @WHERES=' and GpsTime between '''+CONVERT(VARCHAR(19),@S,120)+''' and '''+CONVERT(VARCHAR(19),@E,120)+'''  and EXISTS (select TerminalNo from Terminal where EXISTS (select CarId from Car where CompanyId='''+@CompanyId+''' and CarId=Terminal.CarId) and TerminalNo=Terminal.TerminalNo)'
    ELSE
    begin
    set @t=(select TerminalNo from Terminal where CarId=(select CarId from Car where CarNo=@CarNo))
    set @WHERES=' and GpsTime between '''+CONVERT(VARCHAR(19),@S,120)+''' and '''+CONVERT(VARCHAR(19),@E,120)+''' and dbo.Terminal.TerminalNo='''+@t+''''
    end
    
    SET @SQL='insert into #temptb(TerminalNo,GpsTime,Mileage)(SELECT TerminalNo,GpsTime,Mileage 
    from '+@GpsPath+'
     WHERE 1=1 '+@WHERES+' 
    )'
    Exec(@SQL) 
    set @number=@number+1
    set @S=DATEADD(d,1,@S)
    set @E=DATEADD(d,1,@E)
    end
select t.TerminalNo,sum(Mileage) Mileage,CarNo,CompanyName
from(
    select TerminalNo,convert(varchar(8),Gpstime,112) date,
           max(Mileage) - min(Mileage) mileage
    from #temptb
    group by TerminalNo,convert(varchar(8),Gpstime,112)
) t
inner join dbo.Terminal on t.TerminalNo=dbo.Terminal.TerminalNo
    inner join dbo.Car on dbo.Terminal.CarId=dbo.Car.CarId
    inner join dbo.Company on dbo.Car.CompanyId=dbo.Company.CompanyId 
group by t.TerminalNo,CarNo,CompanyName
        
if object_id('tempdb..#emptb')>0
drop table #temptb



select @end_date = getdate() select datediff(ms,@begin_date,@end_date) as '用时/毫秒'

4.

USE [SGPS_SZ]
GO
/****** Object:  StoredProcedure [dbo].[spMileageStatement]    Script Date: 07/23/2012 09:54:36 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:        <Author,,YangSongKai>
-- Create date: <Create 2012-07-02,,>
-- Description:    <Description,,里程报表>
-- =============================================

ALTER PROCEDURE [dbo].[spMileageStatement](
 @CarNo varchar(30),--车牌号
 @CompanyId varchar(100),--驾校id
 @StartDay varchar(20),--开始日期(年月日)
 @EndDay varchar(20),--结束日期
 @StartTime varchar(20),--开始时间(时分秒)
 @EndTime varchar(20)--结束时间
    )
AS

--自定义变量
declare @result int--日期相差多少天
declare @S datetime--开始时间
declare @E datetime--结束时间
declare @GpsPath varchar(30)--表名
declare @number int--循环种子
declare @WHERES VARCHAR(1000)
declare @SQL VARCHAR(3000)
declare @t varchar(20)
set @S=CONVERT(Datetime,@StartDay+@StartTime)
set @E=CONVERT(Datetime,@StartDay+@EndTime)
--set @GpsPath='dbo.GpsPath'+CONVERT( VARCHAR(8), CAST(FLOOR(CAST(@S AS FLOAT)) AS DATETIME), 112)
set @number=0
set @result=DATEDIFF (d,CONVERT(Datetime,@StartDay),CONVERT(Datetime,@EndDay))

create Table #temptb
(
    TerminalNo varchar(20),
    MinMileage decimal(18,2),
    MaxMileage decimal(18,2),
)
 
declare @begin_date datetime declare @end_date datetime select @begin_date = getdate() 
    while(@number<=@result)
    begin
    set @GpsPath='dbo.GpsPath'+CONVERT( VARCHAR(8), CAST(FLOOR(CAST(@S AS FLOAT)) AS DATETIME), 112)
    IF(@CarNo='' or @CarNo is null)
    --SET @WHERES=' AND dbo.Company.CompanyId='''+@CompanyId+''' and GpsTime between '''+CONVERT(VARCHAR(19),@S,120)+''' and '''+CONVERT(VARCHAR(19),@E,120)+''''
    --SET @WHERES=' and GpsTime between '''+CONVERT(VARCHAR(19),@S,120)+''' and '''+CONVERT(VARCHAR(19),@E,120)+''' and Mileage>0 and EXISTS (select TerminalNo from Terminal where EXISTS (select CarId from Car where CompanyId='''+@CompanyId+''' and CarId=Terminal.CarId) and '+@GpsPath+'.TerminalNo=Terminal.TerminalNo)'
    SET @WHERES='and GpsTime between '''+CONVERT(VARCHAR(19),@S,120)+''' and '''+CONVERT(VARCHAR(19),@E,120)+''' and Mileage>0'
    ELSE
    begin
    set @t=(select TerminalNo from Terminal where CarId=(select CarId from Car where CarNo=@CarNo))
    set @WHERES=' and GpsTime between '''+CONVERT(VARCHAR(19),@S,120)+''' and '''+CONVERT(VARCHAR(19),@E,120)+''' and TerminalNo='''+@t+''' and Mileage>0'
    end   
    SET @SQL='insert into #temptb(TerminalNo,MinMileage,MaxMileage)SELECT tabA.TerminalNo,tabB.Mileage as MinMileage,tabC.Mileage as MaxMileage
FROM
    (SELECT TerminalNo,MIN(id) as MinId,MAX(id) as MaxId
    FROM '+@GpsPath+'
    WHERE 1=1 '+@WHERES+' 
    GROUP BY TerminalNo) tabA
LEFT JOIN '+@GpsPath+' tabB ON tabA.MinId=tabB.Id
LEFT JOIN '+@GpsPath+' tabC ON tabA.MaxId=tabC.Id'    
    Exec(@SQL) 
    set @number=@number+1
    set @S=DATEADD(d,1,@S)
    set @E=DATEADD(d,1,@E)
    end
select ROW_NUMBER() Over(order by CompanyName desc) as rowId,#temptb.TerminalNo,CarNo,CompanyName,SUM(#temptb.MaxMileage-#temptb.MinMileage)as Mileage
from #temptb
inner join dbo.Terminal on #temptb.TerminalNo=dbo.Terminal.TerminalNo
    inner join dbo.Car on dbo.Terminal.CarId=dbo.Car.CarId
    inner join dbo.Company on dbo.Car.CompanyId=dbo.Company.CompanyId 
where  EXISTS (select TerminalNo from #temptb where EXISTS (select CarId from Car where CompanyId=@CompanyId and CarId=Terminal.CarId) and #temptb.TerminalNo=Terminal.TerminalNo) OR #temptb.TerminalNo=@t
--where dbo.Company.CompanyId=@CompanyId OR #temptb.TerminalNo=@t
group by #temptb.TerminalNo,CarNo,CompanyName
        
if object_id('tempdb..#temptb')>0
drop table #temptb

select @end_date = getdate() select datediff(ms,@begin_date,@end_date) as '用时/毫秒'

计划任务:

USE [SGPS_SZ] 
GO
-- =============================================
-- Author:        <Author,,YangSongKai>
-- Create date: <Create Date,2012-07-25 09:18:03,>
-- Description:    <Description,计划任务-统计里程,>
-- =============================================

declare @GpsPath varchar(30)
declare @StartTime varchar(20)--开始时间(时分秒)
declare @EndTime varchar(20)--结束时间
declare @S varchar(20)--开始时间
declare @E varchar(20)--结束时间
declare @CurrentTime datetime--表中最后一条数据的时间
declare @result int--相差天数
declare @number int--循环种子

if object_id('[StatisticsMileage]') is null --如果表不存在,则创建表
begin
create table  StatisticsMileage
(
    rowId int IDENTITY (1,1) PRIMARY KEY ,
    TerminalNo varchar(20),
    CarNo varchar(20),
    [date]datetime,
    CompanyName varchar(30),
    Mileage decimal(18,2)
)
end
set @number=0
set @CurrentTime=(select MAX([date]) from StatisticsMileage)--获取数据库中的最大时间
set @CurrentTime=DATEADD(d,1,@CurrentTime)
if(@CurrentTime is null or @CurrentTime='')
set @CurrentTime='2012-07-20'--这里设置:如果数据库为空,统计的开始时间
set @result=DATEDIFF(d,@CurrentTime,GETDATE())--只能计算本月内相差的天数
 while(@number<=@result)
 begin
    set @GpsPath='dbo.GpsPath'+CONVERT(VARCHAR(10),@CurrentTime,112)--动态数据表
    set @StartTime=' 08:00:00'
    set @EndTime=' 20:00:00'
    set @S=CONVERT(varchar(20),@CurrentTime,23)+@StartTime
    set @E=CONVERT(varchar(20),@CurrentTime,23)+@EndTime
    exec('insert into StatisticsMileage(TerminalNo,CarNo,date,CompanyName,Mileage)select a.TerminalNo,CarNo,date,CompanyName,SUM(a.MaxMileage-a.MinMileage)as Mileage
from 
(SELECT tabA.TerminalNo,tabB.Mileage as MinMileage,tabC.Mileage as MaxMileage,date
FROM
    (SELECT TerminalNo,MIN(id) as MinId,MAX(id) as MaxId,convert(varchar(8),max(GpsTime),112) date
    FROM '+@GpsPath+' 
    WHERE 1=1  and GpsTime between '''+@S+''' and '''+@E+'''   
    GROUP BY TerminalNo) tabA
    LEFT JOIN '+@GpsPath+' tabB ON tabA.MinId=tabB.Id
    LEFT JOIN '+@GpsPath+' tabC ON tabA.MaxId=tabC.Id)a
    inner join dbo.Terminal on a.TerminalNo=dbo.Terminal.TerminalNo
    inner join dbo.Car on dbo.Terminal.CarId=dbo.Car.CarId
    inner join dbo.Company on dbo.Car.CompanyId=dbo.Company.CompanyId 
group by a.TerminalNo,CarNo,CompanyName,date')
    --种子和天数+1
    set @number=@number+1
    set @CurrentTime=DATEADD(d,1,@CurrentTime)
end
原文地址:https://www.cnblogs.com/Archosaur/p/MileageStatement.html