次のような表があります。
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回(1年以上)請求されますが、興味があるのはENDDATEがnullの(つまり、現在の)ものだけです
私は達成したい:
PropertyId Amount
--------------------------
1 220
2 80
私はこのようなことをしようとしました:
SELECT
propertyId,
SUM() as TOTAL_COSTS
FROM
MyTable
ただし、SUMでは、複数の選択を強制して、各タイプの充電の現在の金額を戻す必要がありますか?私はこれが面倒になるのを見ることができました、そして私はもっと簡単な解決策を望んでいます
何か案は?
これにより、プロパティとタイプごとの合計が返されます
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
......
これを試して:
SELECT
PropertyId,
SUM(Amount) as TOTAL_COSTS
FROM
MyTable
WHERE
EndDate IS NULL
GROUP BY
PropertyId
endDateがnullである各プロパティの合計(すべてのタイプの量)を取得することを意味します。
SELECT propertyId, SUM(Amount) as TOTAL_COSTS
FROM MyTable
WHERE EndDate IS NULL
GROUP BY propertyId
次のようなものが欲しいようです:
select PropertyID, SUM(Amount)
from MyTable
Where EndDate is null
Group by PropertyID
WHERE
句は、_GROUP BY
_の前に常に概念的に適用されます(実行計画は必要なことを実行できます)。クエリの_GROUP BY
_の前にある必要があり、フィルターとして機能しますbefore事はSUM
medです。ここでの答えはうまくいきます。
_GROUP BY
_の後にafterが必要なオプションのHAVING
句にも注意する必要があります。これを使用して、GROUP
ingの後にグループの結果のプロパティをフィルタリングできます。たとえば、HAVING SUM(Amount) > 0
総テーブル行を追加するには、共通テーブル式を使用します。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