按时间进行汇总的一个解决方案

 

本例实现了按日期汇总数据的要求(按周汇总本年的定单销售金额)。主要思想是:
1、先将数据列中日期日期转换成我们想要的格式。如:2007-01月上旬
2、再按上述格式对数据进行汇总
3、按用户对数据格式的要求生成时间段表
4、将时间段和汇总表进行左连接


以下函数实现将一段日期格式化到数据表中。


GO
/****** 对象:  UserDefinedFunction [dbo].[LoopTime]    脚本日期: 09/19/2007 15:37:20 ******/
SET  ANSI_NULLS  ON
GO
SET  QUOTED_IDENTIFIER  ON
GO
--  =============================================
--
 Author:        WGF2006
--
 Create date: 2007-9-19
--
 Description:    将时间转换为按年 季 月 旬 周 日的行集 
--
 Parameters:  @STime开始时间 @ETime结束时间 @Type格式化的类型。Y年 Q季 M月 T旬 W周 D日

--  =============================================
CREATE   FUNCTION   [ dbo ] . [ LoopTime ]
(    
    
--  Add the parameters for the function here
     @STime   datetime
    
@ETime   datetime ,
    
@Type   VARCHAR ( 2 )
)
RETURNS   @RetTable   TABLE (ID  INT   IDENTITY ( 1 , 1 ),TimeName  VARCHAR ( 50 )) 
AS
BEGIN
DECLARE    @Time   datetime
SET   @Time = @STime
WHILE ( @Time < @ETime )
BEGIN
    
INSERT   INTO   @RetTable (TimeName)  VALUES (dbo.FormatTime( @Time , @Type ))
    
SELECT   @Time = CASE   @Type   WHEN   ' Y '   THEN   DATEADD (YY, 1 , @Time )
    
WHEN   ' Y '   THEN   DATEADD (YY, 1 , @Time )
    
WHEN   ' Q '   THEN   DATEADD (Q, 1 , @Time )
    
WHEN   ' M '   THEN   DATEADD (M, 1 , @Time )
    
WHEN   ' T '   THEN   [ dbo ] .DATEADDXUN( @Time )
    
WHEN   ' W '   THEN   DATEADD (WK, 1 , @Time )
    
ELSE   DATEADD (D, 1 , @Time )
    
end
END
RETURN
END
  以下函数完成添加一旬的功能
USE   [ MainData ]
GO
/****** 对象:  UserDefinedFunction [dbo].[DATEADDXUN]    脚本日期: 09/19/2007 15:37:52 ******/
SET  ANSI_NULLS  ON
GO
SET  QUOTED_IDENTIFIER  ON
GO
CREATE   FUNCTION   [ dbo ] . [ DateAddXUN ]
(    
    
@STime    datetime  
)
RETURNS     datetime   
AS
BEGIN
    
DECLARE   @DT   datetime
        
IF ( DATEPART (D, @STime ) > 20 )
        
BEGIN
            
-- 处理下旬
             IF ( DATEPART (M, @STime IN  ( 1 , 3 , 5 , 7 , 8 , 10 , 12 ))
                
SET   @DT =   DATEADD (D, 11 , @STime )
            
ELSE   IF ( DATEPART (M, @STime ) = 2 )
                
SET   @DT =    DATEADD (D, 8 , @STime )
            
ELSE
                
SET   @DT =    DATEADD (D, 10 , @STime )
        
END
        
ELSE
            
SET   @DT =    DATEADD (D, 10 , @STime )
        
    
RETURN   @DT
END

以下函数完成日期的
GO
/****** 对象:  UserDefinedFunction [dbo].[FormatTime]    脚本日期: 09/19/2007 15:38:41 ******/
SET  ANSI_NULLS  ON
GO
SET  QUOTED_IDENTIFIER  ON
GO


--  =============================================
--
 Author:        WGF2006
--
 Create date: 2007-9-19
--
 Description:    ''将时间格式化成 年 季 月 旬 周 日方便用来汇总
--
 Parameters:  @DateTime进行格式的时间变量 @Type格式化的类型。Y年 Q季 M月 T旬 W周 D日
--
 =============================================
CREATE   FUNCTION   [ dbo ] . [ FormatTime ]
(    
    
@DateTime    datetime ,
    
@Type   varchar ( 2 )
)
RETURNS   varchar ( 50 )  
AS
begin  
Declare   @str   varchar ( 50
Declare   @day   int
IF ( @Type = ' y ' )
    
-- 格式化成年
     select   @str = Convert ( Varchar ( 4 ), @DateTime , 120 )
else   IF ( @Type = ' q ' )
    
-- 格式化成季度
     select   @str = Convert ( Varchar ( 4 ), datepart (YY,  @DateTime )) + ' - ' + Convert ( Varchar ( 4 ), datepart (quarter,  @DateTime )) + ' 季度 '
else   IF ( @Type = ' m ' )
    
-- 格式化成月
     select   @str = Convert ( Varchar ( 7 ), @DateTime , 120 )
else   IF ( @Type = ' t ' )
begin
    
-- 格式化成旬
     set   @day = datepart (d,  @DateTime )
    
select   @str = Convert ( Varchar ( 7 ), @DateTime , 120 ) + ' ' + case  
    
when    @day   between   1   and   10   then  
    
' 上旬 '
    
when    @day   between   11   and   20   then  
    
' 中旬 '
    
else
     
' 下旬 '
    
end
end
else   IF ( @Type = ' w ' )
    
-- 格式化成周
     select   @str = Convert ( Varchar ( 4 ), @DateTime , 120 ) + ' -第 ' + Convert ( varchar ( 2 ), datepart (wk, @DateTime )) + ' 周  '  
else   
    
-- 格式化成年月日
     select   @str =   Convert ( Varchar ( 10 ), @DateTime , 120
 
return   @str
end  


实现汇总的测试

SELECT B.Bmoney, B.Total ,dbo.FormatTime(TellerTime,'t') AS tn INTO #t FROM CW_ORDER A Join Cw_OrderDetail B ON A.ID=B.OrderID  WHERE TellerTime between '2007-1-1' and'2007-8-31' and  A.state>3 and  A.ISDel=0 
select Sum(BMoney) BMoney ,Sum(Total)Total ,tn into #B From #T  Group by tn
SELECT * FROM dbo.LoopTime ('2007-1-1','2007-8-31','t') A
left JOIN  #B   B
ON A.TimeName= B.Tn
order by B.Bmoney desc
drop table #B
drop table #t

结果如下:

1 2007-01月上旬 71475.00 2007-01月上旬
2 2007-01月中旬 74225.25 2007-01月中旬
3 2007-01月下旬 22275.00 2007-01月下旬
4 2007-02月上旬 NULL NULL
5 2007-02月中旬 NULL NULL
6 2007-02月下旬 NULL NULL
7 2007-03月上旬 NULL NULL
8 2007-03月中旬 NULL NULL
9 2007-03月下旬 550.00 2007-03月下旬

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值