web-dev-qa-db-ja.com

SQL Server:where句を含む複数行のSUM()

次のような表があります。

  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では、複数の選択を強制して、各タイプの充電の現在の金額を戻す必要がありますか?私はこれが面倒になるのを見ることができました、そして私はもっと簡単な解決策を望んでいます

何か案は?

25
Jimmy

これにより、プロパティとタイプごとの合計が返されます

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

......

45
Adriaan Stander

これを試して:

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

endDateがnullである各プロパティの合計(すべてのタイプの量)を取得することを意味します。

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

次のようなものが欲しいようです:

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

WHERE句は、_GROUP BY_の前に常に概念的に適用されます(実行計画は必要なことを実行できます)。クエリの_GROUP BY_の前にある必要があり、フィルターとして機能しますbefore事はSUMmedです。ここでの答えはうまくいきます。

_GROUP BY_の後にafterが必要なオプションのHAVING句にも注意する必要があります。これを使用して、GROUPingの後にグループの結果のプロパティをフィルタリングできます。たとえば、HAVING SUM(Amount) > 0

2
Cade Roux

総テーブル行を追加するには、共通テーブル式を使用します。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
2
Joel