27

我有一个如下所示的表格:

  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 中,我是否会被迫进行多项选择,以恢复每种收费的当前金额?我可以看到这变得混乱,我希望有一个更简单的解决方案

有任何想法吗?

4

6 回答 6

47

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

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

……

于 2009-10-22T14:46:41.643 回答
8

尝试这个:

SELECT
   PropertyId,
   SUM(Amount) as TOTAL_COSTS
FROM
   MyTable
WHERE
   EndDate IS NULL
GROUP BY
   PropertyId
于 2009-10-22T14:43:49.683 回答
5

您的意思是为 EndDate 为空的每个属性获取总和(所有类型的数量):

SELECT propertyId, SUM(Amount) as TOTAL_COSTS
  FROM MyTable
 WHERE EndDate IS NULL
GROUP BY propertyId
于 2009-10-22T14:45:17.980 回答
4

听起来你想要这样的东西:

select PropertyID, SUM(Amount)
from MyTable
Where EndDate is null
Group by PropertyID
于 2009-10-22T14:47:06.450 回答
2

使用公用表表达式添加总计行,top 100order 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
于 2015-03-21T15:56:54.850 回答
2

在. WHERE_ GROUP BY它必须在查询之前出现,并且在处理事情之前GROUP BY充当过滤器,这就是这里大多数答案的工作方式。SUM

您还应该注意HAVING必须. GROUP BY这可用于在GROUPing 之后过滤组的结果属性 - 例如HAVING SUM(Amount) > 0

于 2009-10-22T14:56:45.987 回答