最近领导给了一个光荣而艰巨的任务:掌管公司软件部伙食费用收支。Too Boring,如果你用笔天天记录的话,还好做一个简单的系统也不难一个下午搞定。做到汇总就头疼了,最后干脆一个View搞定,哈哈
数据库中的表如下图:

View功能:
查询每个月总收入和总支出并计算每个月收入支出差额
刚开始的View犯了一个错误就是卡迪尔乘积导致联合查询结果一远远大于真正的结果,错误的View如下:
一个变态View
后来就想改用T-SQL Enhancement in SQL Server 中的CET,如下:
with CET_Checkin
as
(
SELECT isnull(sum(dbo.Checkin.Money),0) as Checkin,
Convert(varchar(7),dbo.Checkin.InDate,120) as Date
from dbo.Checkin
Group by Convert(varchar(7),dbo.Checkin.InDate,120)
)

with CET_Checkout
as
(
SELECT isnull(sum(dbo.Checkout.Money),0) as Checkout,
Convert(varchar(7),dbo.Checkout.Date,120) as 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),0) as Checkout,
Convert(varchar(7),dbo.Checkout.Date,120) as Date
from dbo.Checkout
Group by Convert(varchar(7),dbo.Checkout.Date,120)
) as b
inner join
(
SELECT isnull(sum(dbo.Checkin.Money),0) as Checkin,
Convert(varchar(7),dbo.Checkin.InDate,120) as Date
from dbo.Checkin
Group by Convert(varchar(7),dbo.Checkin.InDate,120)
) as a
on a.Date = b.Date
结果如下:

全部系统源代码 /Files/hongyuniu/Consumes.rar
数据库中的表如下图:

View功能:
查询每个月总收入和总支出并计算每个月收入支出差额
刚开始的View犯了一个错误就是卡迪尔乘积导致联合查询结果一远远大于真正的结果,错误的View如下:
后来就想改用T-SQL Enhancement in SQL Server 中的CET,如下:
with CET_Checkin
as
(
SELECT isnull(sum(dbo.Checkin.Money),0) as Checkin,
Convert(varchar(7),dbo.Checkin.InDate,120) as Date
from dbo.Checkin
Group by Convert(varchar(7),dbo.Checkin.InDate,120)
)
with CET_Checkout
as
(
SELECT isnull(sum(dbo.Checkout.Money),0) as Checkout,
Convert(varchar(7),dbo.Checkout.Date,120) as 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),0) as Checkout,
Convert(varchar(7),dbo.Checkout.Date,120) as Date
from dbo.Checkout
Group by Convert(varchar(7),dbo.Checkout.Date,120)
) as b
inner join
(
SELECT isnull(sum(dbo.Checkin.Money),0) as Checkin,
Convert(varchar(7),dbo.Checkin.InDate,120) as Date
from dbo.Checkin
Group by Convert(varchar(7),dbo.Checkin.InDate,120)
) as a
on a.Date = b.Date
结果如下:

全部系统源代码 /Files/hongyuniu/Consumes.rar

浙公网安备 33010602011771号