SQL Server: SUM () из нескольких строк, включая предложения where - PullRequest
25 голосов
/ 22 октября 2009

У меня есть таблица, которая выглядит примерно так:

  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 равен нулю (другими словами, текущий)

Я бы хотел достичь:

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

Я пытался сделать что-то вроде этого:

SELECT
   propertyId,
   SUM() as TOTAL_COSTS
FROM
   MyTable

Однако в СУММЕ я был бы вынужден иметь несколько вариантов выбора, возвращая текущую сумму для каждого типа заряда? Я мог видеть, что это становится грязным, и я надеюсь на гораздо более простое решение

Есть идеи?

Ответы [ 6 ]

45 голосов
/ 22 октября 2009

Это вернет итоги по каждому свойству и типу

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

......

8 голосов
/ 22 октября 2009

Попробуйте это:

SELECT
   PropertyId,
   SUM(Amount) as TOTAL_COSTS
FROM
   MyTable
WHERE
   EndDate IS NULL
GROUP BY
   PropertyId
5 голосов
/ 22 октября 2009

Вы имеете в виду сумму сбора (количество всех типов) для каждого свойства, для которого EndDate имеет значение null:

SELECT propertyId, SUM(Amount) as TOTAL_COSTS
  FROM MyTable
 WHERE EndDate IS NULL
GROUP BY propertyId
4 голосов
/ 22 октября 2009

звучит так, как будто вы хотите что-то вроде:

select PropertyID, SUM(Amount)
from MyTable
Where EndDate is null
Group by PropertyID
2 голосов
/ 21 марта 2015

Используйте общее табличное выражение для добавления итоговой строки, для работы order by требуется top 100.

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 голосов
/ 22 октября 2009

Предложение WHERE всегда концептуально применяется (план выполнения может делать то, что он хочет, очевидно) до GROUP BY. Он должен предшествовать GROUP BY в запросе и действовать как фильтр перед вещами SUM med, именно так работает большинство ответов.

Вам также следует помнить о необязательном предложении HAVING, которое должно идти после GROUP BY. Это можно использовать для фильтрации результирующих свойств групп после GROUP ing - например, HAVING SUM(Amount) > 0

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...