SQL Server: SUM () de varias filas, incluidas las cláusulas WHERE

Tengo una table que se parece a lo siguiente:

PropertyID Amount Type EndDate -------------------------------------------- 1 100 RENT null 1 50 WATER null 1 60 ELEC null 1 10 OTHER null 2 70 RENT null 2 10 WATER null 

Habrá múltiples artículos facturados a una propiedad, también facturados varias veces. Por ejemplo, RENT se puede facturar a la propiedad # 1 12 veces (más de un año), sin embargo, los únicos que me interesan son aquellos con ENDDATE de nulo (en otras palabras, actual)

Me gustaría lograr:

  PropertyId Amount -------------------------- 1 220 2 80 

He intentado hacer algo como esto:

 SELECT propertyId, SUM() as TOTAL_COSTS FROM MyTable 

Sin embargo, en la SUM ¿me verían obligado a tener múltiples selects para recuperar el monto actual de cada tipo de cargo? Pude ver que se estaba volviendo desorderado y estoy esperando una solución mucho más simple

¿Algunas ideas?

Esto traerá totales por propiedad y tipo

 SELECT PropertyID, TYPE, SUM(Amount) FROM yourTable GROUP BY PropertyID, TYPE 

Esto traerá de vuelta solo valores activos

 SELECT PropertyID, TYPE, SUM(Amount) FROM yourTable WHERE EndDate IS NULL GROUP BY PropertyID, TYPE 

y esto traerá de vuelta los totales de las properties

 SELECT PropertyID, SUM(Amount) FROM yourTable WHERE EndDate IS NULL GROUP BY PropertyID 

……

Prueba esto:

 SELECT PropertyId, SUM(Amount) as TOTAL_COSTS FROM MyTable WHERE EndDate IS NULL GROUP BY PropertyId 

te refieres a get sum (cantidad de todos los types) para cada propiedad donde EndDate es nulo:

 SELECT propertyId, SUM(Amount) as TOTAL_COSTS FROM MyTable WHERE EndDate IS NULL GROUP BY propertyId 

Parece que quieres algo como:

 select PropertyID, SUM(Amount) from MyTable Where EndDate is null Group by PropertyID 

La cláusula WHERE siempre se aplica conceptualmente (el plan de ejecución puede hacer lo que quiera, obviamente) antes del GROUP BY . Debe aparecer antes que el GROUP BY en la consulta, y actúa como un filter antes de que las cosas sean SUM med, que es cómo funcionan la mayoría de las respuestas aquí.

También debe conocer la cláusula HAVING opcional que debe aparecer después de GROUP BY . Esto se puede usar para filtrar las properties resultantes de los grupos después de GROUP ing – por ejemplo HAVING SUM(Amount) > 0

Use una expresión de tabla común para agregar una fila total general, se requieren las top 100 para order by para trabajar.

 With Detail as ( SELECT top 100 propertyId, SUM(Amount) as TOTAL_COSTS FROM MyTable WHERE EndDate IS NULL GROUP BY propertyId ORDER BY TOTAL_COSTS desc ) Select * from Detail Union all Select ' Total ', sum(TOTAL_COSTS) from Detail