J'ai une table qui ressemble à ceci:
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 articles facturés à une propriété, également facturés plusieurs fois. Par exemple, RENT pourrait être facturé à la propriété # 1 12 fois (sur une année), mais les seuls qui m'intéressent sont ceux dont ENDDATE est nul (en d'autres termes, actuel)
Je souhaite réaliser:
PropertyId Amount
--------------------------
1 220
2 80
J'ai essayé de faire quelque chose comme ça:
SELECT
propertyId,
SUM() as TOTAL_COSTS
FROM
MyTable
Cependant, dans le SUM, serais-je obligé d'avoir plusieurs sélections ramenant le montant actuel pour chaque type de frais? Je pouvais voir cela devenir désordonné et j'espère une solution beaucoup plus simple
Des idées?
Cela ramènera les totaux par propriété et type
SELECT PropertyID,
TYPE,
SUM(Amount)
FROM yourTable
GROUP BY PropertyID,
TYPE
Cela ne ramènera que les valeurs actives
SELECT PropertyID,
TYPE,
SUM(Amount)
FROM yourTable
WHERE EndDate IS NULL
GROUP BY PropertyID,
TYPE
et cela ramènera les totaux des propriétés
SELECT PropertyID,
SUM(Amount)
FROM yourTable
WHERE EndDate IS NULL
GROUP BY PropertyID
......
Essaye ça:
SELECT
PropertyId,
SUM(Amount) as TOTAL_COSTS
FROM
MyTable
WHERE
EndDate IS NULL
GROUP BY
PropertyId
vous voulez dire getiing sum (montant de tous les types) pour chaque propriété où EndDate est null:
SELECT propertyId, SUM(Amount) as TOTAL_COSTS
FROM MyTable
WHERE EndDate IS NULL
GROUP BY propertyId
sonne comme si vous vouliez quelque chose comme:
select PropertyID, SUM(Amount)
from MyTable
Where EndDate is null
Group by PropertyID
La clause WHERE
est toujours appliquée conceptuellement (le plan d'exécution peut faire ce qu'il veut, évidemment) avant le GROUP BY
. Il doit précéder le GROUP BY
Dans la requête et agit comme un filtre avant les choses sont SUM
med, c'est ainsi que fonctionnent la plupart des réponses ici.
Vous devez également être conscient de la clause HAVING
facultative qui doit venir après le GROUP BY
. Cela peut être utilisé pour filtrer les propriétés résultantes des groupes après GROUP
ing - par exemple HAVING SUM(Amount) > 0
Utilisez une expression de table commune pour ajouter la ligne du total général, top 100
est requis pour order by
travailler.
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