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

本文介绍了一种使用SQL函数按周汇总订单销售额的方法。通过自定义函数实现日期格式化,并利用这些函数创建时间段表,最后通过左连接实现数据汇总。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

本例实现了按日期汇总数据的要求(按周汇总本年的定单销售金额)。主要思想是:
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,@STimeIN (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月下旬

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值