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?

25
demandé sur gbn 2009-10-22 18:40:24

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

......

44
répondu Adriaan Stander 2015-06-07 06:56:44

essaye ceci:

SELECT
   PropertyId,
   SUM(Amount) as TOTAL_COSTS
FROM
   MyTable
WHERE
   EndDate IS NULL
GROUP BY
   PropertyId
8
répondu gbn 2009-10-22 14:50:58

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
5
répondu manji 2009-10-22 14:45:17

sons comme vous voulez quelque chose comme:

select PropertyID, SUM(Amount)
from MyTable
Where EndDate is null
Group by PropertyID
4
répondu CSharpAtl 2009-10-22 14:47:06

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 GROUPing - par exemple HAVING SUM(Amount) > 0

2
répondu Cade Roux 2009-10-22 14:56:45

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
2
répondu Joel 2016-01-29 09:50:05