SQL Server: SOMME() de plusieurs lignes, y compris les clauses where
j'ai une table qui ressemble à quelque chose comme :
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
Il y aura plusieurs éléments facturés à une propriété, également facturés plusieurs fois. Par exemple le loyer pourrait être facturé à la propriété #1 12 fois (sur un an), mais les seuls qui m'intéressent sont ceux avec date de fin de null (en d'autres mots, actuel)
j'aimerais réaliser :
PropertyId Amount
--------------------------
1 220
2 80
j'ai essayé de faire quelque chose comme ceci :
SELECT
propertyId,
SUM() as TOTAL_COSTS
FROM
MyTable
Toutefois, dans le Somme serais-je forcé d'avoir plusieurs sélections ramenant le montant actuel pour chaque type de charge? Je pouvais voir cela devenir un désordre et j'espère une solution beaucoup plus simple
des idées?
6 réponses
cela ramènera les totaux par propriété et le type
SELECT PropertyID,
TYPE,
SUM(Amount)
FROM yourTable
GROUP BY PropertyID,
TYPE
Cela va ramener active uniquement les valeurs
SELECT PropertyID,
TYPE,
SUM(Amount)
FROM yourTable
WHERE EndDate IS NULL
GROUP BY PropertyID,
TYPE
et cela va ramener les totaux pour les propriétés
SELECT PropertyID,
SUM(Amount)
FROM yourTable
WHERE EndDate IS NULL
GROUP BY PropertyID
......
essaye ceci:
SELECT
PropertyId,
SUM(Amount) as TOTAL_COSTS
FROM
MyTable
WHERE
EndDate IS NULL
GROUP BY
PropertyId
tu veux dire getiing somme(somme de tous les types) pour chaque propriété où la date de fin est nulle:
SELECT propertyId, SUM(Amount) as TOTAL_COSTS
FROM MyTable
WHERE EndDate IS NULL
GROUP BY propertyId
sons comme vous voulez quelque chose comme:
select PropertyID, SUM(Amount)
from MyTable
Where EndDate is null
Group by PropertyID
WHERE
la clause est toujours appliquée conceptuellement (le plan d'exécution peut faire ce qu'il veut, évidemment) avant le GROUP BY
. Il doit venir avant le GROUP BY
dans la requête, et agit comme un filtre avant les choses sont SUM
med, qui est la façon dont la plupart des réponses ici fonctionnent.
Vous devez aussi être conscient de l'option HAVING
l'article qui doit venir aprèsGROUP BY
. Ceci peut être utilisé pour filtrer sur les propriétés résultant de groupes après GROUP
ing - par exemple HAVING SUM(Amount) > 0
utilisez une expression de table commune pour ajouter grand total row,top 100
est nécessaire pour order by
au travail.
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