2009-12-22 9 views
5

¿Alguien me puede ayudar con esta consulta?No se puede realizar una función de agregado en una subconsulta

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 

Tengo problemas con la segunda suma, no me deja hacerlo. Evidentemente SUM no funcionará en las subconsultas, pero necesito calcular el alquiler esperado (MonthlyRent si hay un inquilino asignado a la ID de RentalUnit, 0 de ellos no). ¿Cómo puedo hacer que esto funcione?

+0

incluso realizar una búsqueda para estar seguro ... No hay una tercera SUMA :-) – KLE

+0

segundos! ¡Lo siento! Mi error. – Malfist

+0

¿Cuál es el significado del producto del alquiler mensual de la unidad de alquiler multiplicado por el número de inquilinos en esa unidad? No va a cobrar el alquiler completo de cada inquilino de la unidad, ¿verdad? –

Respuesta

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 

Aquí hay un script de prueba para comprobar:

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

¿Qué significa aplicar exterior? – Malfist

+0

ru.MontlyRent no se puede utilizar allí. – Malfist

+0

Es como una combinación externa, con la diferencia de que utiliza una consulta interna en lugar de una subconsulta. –

0

¿Cuál es el significado de la suma de los tiempos unitMonthlyRent el número de inquilinos, por alguna unidad de alquiler partiicular (COUNT(t.ID) * ru.MonthlyRent)?

¿Es el caso que todo lo que está tratando de hacer es ver la diferencia entre la renta potencial total de todos los ingresos frente a la renta esperada (de unidades solo ocupó)? Si es así, entonces prueba este

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

No, esto no funciona. r.PropertyID en la combinación izquierda ni siquiera está en el alcance. – Malfist

+0

Sí, vea que ahora, la unión debe ser a la unidad de alquiler en su esquema –

Cuestiones relacionadas