我有一个类似于这样的表数据结构:
房东桌
Id Name Email
```````````````````````
1 J Johnson ...
2 R Kelly ...
属性表
Id Address Rent LandlordId
```````````````````````````````````
1 .... 400 1
2 .... 600 1
3 .... 750 2
保养表
Id Details Cost MaintenanceDate PropertyId
`````````````````````````````````````````````````````
1 .... 25 20/12/2012 1
2 .... 120 22/12/2012 2
3 .... 35 24/12/2012 3
本质上,房东有多个房产。每个月,我需要为房东开具发票,其中包括他的所有房产,对他的房产进行的所有维护。为了计算我需要付给房东多少钱,我需要将他所有房产的租金相加,然后减去他当月所有维护费用的总和。
因此,应支付给房东的金额 L = Sum(L 的房产租金) - Sum(L 在本月内所有房产的维护费用)
我正在使用 Telerik 报告,我认为我可以通过一些巧妙的分组来实现它,但那是在浪费我的时间,所以我现在将尝试使用 SQL 和子报告来实现它。
我正在尝试的 SQL 查询是这样的:
SELECT l.Name, p.[Address], p.Rent, c.Details, c.Cost,
(select Rent From Property where Id = p.Id) -
(select SUM(cost) from CarriedOutJobs where PropertyId = p.Id)
as PayableToLandlord
FROM Landlord l JOIN PROPERTY p ON p.LandlordId = l.Id
LEFT OUTER JOIN Maintenance c ON c.PropertyId = p.Id
ORDER BY l.Fullname
这似乎无法正常工作,因为它会产生多个字段
因为我要将报告分解为子报告,所以我想我会先获取房东的详细信息,但即使在这种情况下,我仍然需要计算应支付给房东的金额。所以我将查询重写为:
SELECT distinct l.Name,
(SELECT SUM(Rent) FROM PROPERTY WHERE LandlordId = l.Id) -
(SELECT COALESCE(SUM(cost), 0)
FROM CarriedOutJobs WHERE PropertyId = p.Id) AS PayableToLandlord
FROM Landlord l
JOIN PROPERTY p ON p.LandlordId = l.Id
ORDER BY l.Fullname
我认为这行得通,但即使我使用了 distinct,这似乎会产生一个PayableToLandlord
数量不同的重复行,我似乎无法弄清楚为什么。
请问有没有办法在一个查询中选择所有房东、他们的财产以及应付给他们的金额?
为了简单起见,我在这里删除了 date where 子句。
谢谢。