私はこれに似たテーブルデータ構造を持っています:
家主テーブル
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
量が異なる重複行が生成されるようで、理由がわかりません。
すべての家主、その物件、および家主に支払う金額を1つのクエリで選択する方法はありますか?
ここでは、わかりやすくするために、datewhere句を削除しました。
ありがとう。