如何解决数据库统计时的会计年度和会计月份问题

在数据库中进行数据统计时,通常以会计月份、会计年度作为统计的时间段,例如下面的 SQL 语句:

SELECT Year(f_date) AS Y, Month(f_date) AS M, SUM(f_money) AS totalMoney GROUP BY Year(f_date), Month(f_date);

但是世界各国的会计年度不尽相同,比如中、俄、德等国采用的是 1 月 - 12 月,日、英、加拿大、印度等国采用的是 4 月 至次年 3 月,
美、泰、缅甸等国采用的是 10 月至次年 9 月等等,至于会计月份则更多样,甚至不同的公司会计月份都是不同的。如果使用上面的方法
统计显然不行。比如这样的日期 2008-11-08,对于美国这样的国家实际上应该统计到 2009 年的会计年度中,用上面的语句却会将其统
计到 2008 年,月份是一样的道理。解决办法之一是在数据库中增加计算字段,根据实际的日期计算出其会计年份和月份,不过有时候可能
是在处理一个已有的数据库系统,不允许修改数据库的表结构,此时可以通过 SQL 语句来实现:

例如一个公司的会计年度是 10 月至次年 9 月,会计月份是 23 号至下个月 22 号:

SELECT   CASE   WHEN  (table_2.M  >   9 THEN  table_2.Y  -   1  
       
ELSE  table_2.Y  END   AS  Y,table_2.M,table_2.totalMoney
FROM
(
 
SELECT   CASE   WHEN  ( CASE   WHEN   DAY (f_date)  >   22  
                   
THEN  ( MONTH (f_date)  +   1 %   13  
                   
ELSE   MONTH (f_date)  END   >   9 )   
        
THEN   YEAR (f_date)  +   1  
        
ELSE   YEAR (f_date)  END   AS  Y, 
        
        
CASE   WHEN   DAY (f_date)  >   22  
        
THEN  ( MONTH (f_date)  +   1 %   13  
        
ELSE   MONTH (f_date)  END   AS  M, 
        
        
SUM (f_money)  AS  totalMoney
 
FROM  table_1
 
GROUP   BY   CASE   WHEN  ( CASE   WHEN   DAY (f_date)  >   22  
                    
THEN  ( MONTH (f_date)  +   13 %   12  
                    
ELSE   MONTH (f_date)  END   >   9 )
         
THEN   YEAR (f_date)  +   1   ELSE   YEAR (f_date)  END ,
               
         
CASE   WHEN   DAY (f_date)  >   22  
         
THEN  ( MONTH (f_date)  +   1 %   13  
         
ELSE   MONTH (f_date)  END
 
WITH  ROLLUP
)
AS  table_2

当然这计算会降低查询的速度。
举例:
table_1
f_date          f_money

2008-09-22      1
2008-09-23      3
2008-10-22     5
2008-10-23     7
2009-09-22     11

结果:
Y           M    totalMoney
2008     9         1
2008     NULL    1
2009     9         11
2008     10       8
2008     11       7
2009     NULL   26
NULL NULL 27

转载于:https://www.cnblogs.com/JoeDZ/archive/2008/06/30/1232713.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值