我有一个类似于以下内容的表:
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中,我会被迫多次选择,以便为每种类型的费用带回当前金额?我可以看到这变得混乱,我希望有一个更简单的解决方案
有什么想法吗?
答案 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