2009-10-22 31 views
25

Tengo una tabla que se ve algo como lo siguiente:SQL Server: SUMA() de varias filas incluidos, en las cláusulas

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 null (en otras palabras, actual)

Me gustaría lograr:

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

he tratado de hacer algo como esto:

SELECT 
    propertyId, 
    SUM() as TOTAL_COSTS 
FROM 
    MyTable 

Sin embargo, en la SUM iba a estar obligado a tener múltiples selecciona traer de vuelta a la cantidad de corriente para cada tipo de carga? Pude ver que se estaba volviendo desordenado y estoy esperando una solución mucho más simple

¿Alguna idea?

Respuesta

43

Esto traerá de vuelta totales por propiedad y escriba

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

Esto devolverá solo los valores activos

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

y esto va a traer de vuelta los totales para las propiedades

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

......

+0

gracias! Fui por el tercero, agregué algunas combinaciones extra a otras mesas, ¡y listo para que todo funcione! ;) – Jimmy

8

Prueba esto:

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

Has olvidado Amount inside SUM(). –

+0

@Peter: Doh! gracias. Eso es lo que obtienes por apresurarse ... – gbn

5

te refieres a getiing suma (Cantidad de todo tipo) para cada propiedad donde EndDate es nulo:

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

suena como usted quiere algo como:

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

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

También debe tener en cuenta la cláusula opcional HAVING que debe venir después de el GROUP BY. Esto se puede utilizar para filtrar en las propiedades resultantes de los grupos después de GROUP ing - por ejemplo HAVING SUM(Amount) > 0

2

Uso una expresión de tabla común añadir fila de gran total, se requiere top 100 para order by a 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 
Cuestiones relacionadas