hongyuniu

Whatever You Do, Do Your Best !

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
最近领导给了一个光荣而艰巨的任务:掌管公司软件部伙食费用收支。Too Boring,如果你用笔天天记录的话,还好做一个简单的系统也不难一个下午搞定。做到汇总就头疼了,最后干脆一个View搞定,哈哈

数据库中的表如下图:


 

View功能:
    查询每个月总收入和总支出并计算每个月收入支出差额

刚开始的View犯了一个错误就是卡迪尔乘积导致联合查询结果一远远大于真正的结果,错误的View如下:


一个变态View

后来就想改用T-SQL Enhancement in SQL Server 中的CET,如下:
with CET_Checkin 
as
(
    
SELECT  isnull(sum(dbo.Checkin.Money),0as Checkin,
            
Convert(varchar(7),dbo.Checkin.InDate,120as Date
    
from    dbo.Checkin
    
Group by Convert(varchar(7),dbo.Checkin.InDate,120)
)

with CET_Checkout 
as
(
    
SELECT  isnull(sum(dbo.Checkout.Money),0as Checkout,
            
Convert(varchar(7),dbo.Checkout.Date,120as Date
    
from    dbo.Checkout
    
Group by Convert(varchar(7),dbo.Checkout.Date,120)
)

select     CET_Checkin.CheckIn , CET_Checkout.Checkout,
         
isnull(Convert(varchar(7),CET.Checkout.Date,120),Convert(varchar(7),CET.Checkin.Date,120))as Date
from     CET_Checkin left join CET_Checkout
on         CET_Checkin.Date = CET_Checkout.Date

可在一个View里只允许又一个CET,多于一个就会报错,无奈只好又想了个办法,真正的View如下
Select     a.Checkin, b.Checkout,
         (a.Checkin 
- b.Checkout) as Balance,
         
isnull(Convert(varchar(7),b.Date,120),Convert(varchar(7),a.Date,120))as Date
From    
(
        
SELECT  isnull(sum(dbo.Checkout.Money),0as Checkout,
            
Convert(varchar(7),dbo.Checkout.Date,120as Date
        
from    dbo.Checkout
        
Group by Convert(varchar(7),dbo.Checkout.Date,120)
)        
as b
inner join
(
        
SELECT  isnull(sum(dbo.Checkin.Money),0as Checkin,
            
Convert(varchar(7),dbo.Checkin.InDate,120as Date
        
from    dbo.Checkin
        
Group by Convert(varchar(7),dbo.Checkin.InDate,120)
)        
as a
on        a.Date = b.Date

结果如下:


全部系统源代码 /Files/hongyuniu/Consumes.rar
posted on 2007-10-08 11:24  CsharpFish  阅读(506)  评论(2)    收藏  举报