web-dev-qa-db-fra.com

SQL Server: SUM () de plusieurs lignes, y compris les clauses where

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?

25
Jimmy

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

......

45
Adriaan Stander

Essaye ça:

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

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
5
manji

sonne comme si vous vouliez quelque chose comme:

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

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

2
Cade Roux

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
2
Joel