2009-12-22 17 views
5

Birisi bana bu sorguda yardımcı olabilir mi?Alt sorguda bir toplu işlev gerçekleştirilemiyor

SELECT p.OwnerName, SUM(ru.MonthlyRent) AS PotentinalRent, SUM(
    (SELECT COUNT(t.ID) * ru.MonthlyRent FROM tblTenant t 
     WHERE t.UnitID = ru.ID) 
    ) AS ExpectedRent 
FROM tblRentalUnit ru 
LEFT JOIN tblProperty p ON p.ID = ru.PropertyID 
GROUP BY p.OwnerName 

İkinci toplamla ilgili sorun yaşıyorum, yapmama izin vermiyor. Açıkça SUM alt sorgularda çalışmaz, ancak beklenen rantı hesaplamam gerekir (RentalUnit'in id'sine atanmış bir kiracı varsa, o zaman 0'dır). Bu işi nasıl yapabilirim?

+0

ben bile emin olmak için bir arama deneyin ... – KLE

+0

saniyede :-) üçüncü SUM yoktur! Afedersiniz! Benim hatam. – Malfist

+0

Kira biriminin Aylık kira süresinin, o ünitedeki kiracı sayısının anlamı nedir? Ünitedeki her kiracıdan tam kiranı almayacak mısın? –

cevap

6
SELECT p.OwnerName, SUM(ru.MonthlyRent) AS PotentialRent, SUM(cnt) AS ExpectedRent 
FROM tblRentalUnit ru 
LEFT JOIN 
     tblProperty p 
ON  p.ID = ru.PropertyID 
OUTER APPLY 
     (
     SELECT COUNT(t.id) * ru.MonthlyRent AS cnt 
     FROM tblTenant t 
     WHERE t.UnitID = ru.ID 
     ) td 
GROUP BY p.OwnerName 

İşte bir test komut kontrol etmek var:

WITH tblRentalUnit AS 
     (
     SELECT 1 AS id, 100 AS MonthlyRent, 1 AS PropertyID 
     UNION ALL 
     SELECT 2 AS id, 300 AS MonthlyRent, 2 AS PropertyID 
     ), 
     tblProperty AS 
     (
     SELECT 1 AS id, 'Owner 1' AS OwnerName 
     UNION ALL 
     SELECT 2 AS id, 'Owner 2' AS OwnerName 
     ), 
     tblTenant AS 
     (
     SELECT 1 AS id, 1 AS UnitID 
     UNION ALL 
     SELECT 2 AS id, 1 AS UnitID 
     ) 
SELECT p.OwnerName, SUM(ru.MonthlyRent) AS PotentialRent, SUM(cnt) AS ExpectedRent 
FROM tblRentalUnit ru 
LEFT JOIN 
     tblProperty p 
ON  p.ID = ru.PropertyID 
OUTER APPLY 
     (
     SELECT COUNT(t.id) * ru.MonthlyRent AS cnt 
     FROM tblTenant t 
     WHERE t.UnitID = ru.ID 
     ) td 
GROUP BY p.OwnerName 
+0

Dış uygulama ortalama nedir? – Malfist

+0

ru.MontlyRent orada kullanılamaz. – Malfist

+0

Dış sorgu gibi bir alt sorgu yerine iç sorgu kullandığı farkla. –

0

unitMonthlyRent zamanlarının toplamı kiracı sayısının anlamı bazı partiicular kira birim (COUNT(t.ID) * ru.MonthlyRent) için, nedir?

Yapmaya çalıştığınız tek şey, tüm ranttan beklenen kira rantına göre toplam potansiyel kira arasındaki farkı görmesidir (Yalnızca kapalı birimlerden)? Eğer öyleyse, o zaman bu

Select p.OwnerName, 
    Sum(r.MonthlyRent) AS PotentinalRent, 
    Sum(Case t.Id When Null Then 0 
     Else r.MonthlyRent End) ExpectedRent 
From tblRentalUnit r 
    Left Join tblTenant t 
     On t.UnitID = r.ID 
    left Join tblProperty p 
     On p.ID = r.PropertyID) 
Group By p.OwnerName 
+0

Hayır, bu işe yaramıyor. sol birleşimdeki r.PropertyID kapsamda değildir. – Malfist

+0

Evet, şuna bakın: şema, şemanızdaki kiralama birimine olmalıdır –

İlgili konular