有表order_20060612,20060612表示2006年6月12日当天的订单表,每天都有这样的一张表,表中有一个money字段,如果有新的订单就加一条记录。写一存储过程sp_aa,求出一个时间段内的订单总数和总的金额。
其中@start为开始时间,@end为结束时间,@count为订单总数(输出类型),@totalmoney为总金额(输出类型)

解决方案 »

  1.   

    CREATE PROCEDURE sp_aa
    (
    @start VARCHAR(20), 
    @end VARCHAR(20),
    @totalmoney int output,
    @count int output
    ) ASDECLARE @SQL VARCHAR(8000), @TblName VARCHAR(20), @YMFrom  VARCHAR(6), @YMTo VARCHAR(6)
    SELECT @YMFrom =CAST(DATEPART(YYYY, CAST(@start AS DATETIME)) AS VARCHAR(4))+
    SUBSTRING(CAST(DATEPART(MM, CAST(@start AS DATETIME))+100 AS VARCHAR(3)), 2, 2)+
    SUBSTRING(CAST((DATEPART(DD,CAST(@start AS DATETIME))+1000) AS VARCHAR(4)),3,2),
    @YMTo =CAST(DATEPART(YYYY, CAST(@end AS DATETIME)) AS VARCHAR(4))+
    SUBSTRING(CAST(DATEPART(MM, CAST(@end AS DATETIME))+100 AS VARCHAR(3)), 2, 2)+
    SUBSTRING(CAST((DATEPART(DD,CAST(@end AS DATETIME))+1000) AS VARCHAR(4)),3,2)---------通过传入参数‘2006-05-12’得到‘200605’这样的字符串,用于确定游标访问的表SET @SQL = 'SELECT * FROM EventsTmp'
    ---------------------------------------------------------------------------------------游标
    DECLARE MyCur CURSOR FOR
    SELECT  Name
    FROM dbo.sysobjects 
    WHERE Name like 'order[_]%' 
    AND SUBSTRING(Name,7,4)+
    SUBSTRING(Name,11,2)+SUBSTRING(Name,13,2) BETWEEN @YMFrom AND @YMTo---------得到要查询的表
    OPEN MyCur------------打开游标
    FETCH NEXT FROM MyCur
    INTO @TblName  ---------取得下一个表名放入临时变量@TblName,从第一个开始取
    WHILE @@FETCH_STATUS = 0    ------从游标里取得行(表)成功
    BEGIN
    IF @SQL=''
    SET @SQL='SELECT * FROM '+@TblName 
    ELSE
    SET @SQL=@SQL+' UNION SELECT * FROM '+@TblName  
    FETCH NEXT FROM MyCur
    INTO @TblName ---------再取得下一个表名放入临时变量@TblName
    END
    CLOSE MyCur-----操作游标结束,关闭游标
    DEALLOCATE MyCur-------删除游标引用现在你要的什么定单数啊,总和都可以从@SQL中查询得了
      

  2.   

    Create Proc Proc_sp_aa
    {
       @statedate datetime,
       @enddate datetime,
       @ordercount int OUTPUT,
       @ordermoney money OUTPUT
    }
    as
    SELECT COUNT(*) FROM ORDERS WHERE STATE=@STATEDATE AND ENDDATE=@ENDDATE
    SELECT SUM(ORDERMONEY) FROM ORDERS WHERE STATE=@STATEDATE AND ENDDATE=@ENDDATE
      

  3.   

    俺也写了一个,比较土的方法
    SQL还是不行啊
    效率肯定粉低
    楼主可以参考CREATE PROCEDURE [dbo].[GetOrderInfo]
     @tableName varchar(128)
    AS
     declare @sql nvarchar(1024)
     set @sql = N'select count(*) ,sum([Money]) from ' + @tableName exec (@sql)
    GOCREATE PROCEDURE [dbo].[GetAllOrderDetail]
      @BeginDate datetime,
      @endDate datetime
     AS 
      CREATE TABLE #TEMP(orderCount int, orderMonkey money)   while (datediff(day,@BeginDate,@endDate) > 0)
      begin
           
            declare @tableName varchar(64)
            declare @tempDate datetime
            set @tempDate =  dateadd(day,1,@BeginDate)
            set @tableName = 'order_' + replace(convert( varchar(10),@tempDate,20),'-','')
            
             if( object_id(@tableName) > 0)
             begin
    insert into #TEMP(orderCount,orderMonkey)
    EXEC GETORDERINFO @tableName
             end  
             set @BeginDate = @tempDate
      endSELECT sum(orderCount),sum(orderMonkey) FROM #TEMPDROP TABLE #TEMP
    GO
      

  4.   

    里面考虑到了当天没有订单的情况
    没有使用游标,使用了while循环,给开始时间不停的+1天知道结束时间构建了个临时表(没有用union all的方式)然后进行插入,最后删除……