SQL Server:多行的SUM(),包括where子句

时间:2009-10-22 14:40:24

标签: sql sql-server tsql aggregate

我有一个类似于以下内容的表:

  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

将向物业收取多个物品,并且还会多次收费。例如,RENT可以向属性#1收费12次(超过一年),但是我唯一感兴趣的是ENDDATE为null(换句话说,当前)

我想实现:

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

我试过这样的事情:

SELECT
   propertyId,
   SUM() as TOTAL_COSTS
FROM
   MyTable

但是,在SUM中,我会被迫多次选择,以便为每种类型的费用带回当前金额?我可以看到这变得混乱,我希望有一个更简单的解决方案

有什么想法吗?

6 个答案:

答案 0 :(得分:45)

这将带回每个属性的总数和类型

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

这将仅返回活动值

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

这将带回属性的总数

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

...

答案 1 :(得分:8)

试试这个:

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

答案 2 :(得分:5)

你的意思是EndDate为null的每个属性的getiing sum(所有类型的数量):

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

答案 3 :(得分:4)

听起来像你想要的东西:

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

答案 4 :(得分:2)

WHERE之前,GROUP BY子句总是在概念上应用(执行计划可以按照自己的意愿行事)。它必须位于查询中的GROUP BY之前,并且在事物为SUM med之前充当过滤器,这就是大多数答案的工作原理。

您还应该了解可选的HAVING条款,该条款必须在<{strong> GROUP BY之后。这可用于在GROUP之后过滤组的结果属性 - 例如HAVING SUM(Amount) > 0

答案 5 :(得分:2)

使用公用表表达式添加总计行,top 100需要order by才能生效。

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