SQL Server: SUM() на множество редове, включително клаузи where

Имам таблица, която изглежда нещо като следното:

  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 обаче ще бъда ли принуден да имам няколко селекции, връщащи текущата сума за всеки тип такса? Виждам, че това става объркано и се надявам на много по-просто решение

Някакви идеи?


person Jimmy    schedule 22.10.2009    source източник


Отговори (6)


Това ще върне общите суми за собственост и тип

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

......

person Adriaan Stander    schedule 22.10.2009
comment
Благодаря! Отидох за 3-та, добавих някои допълнителни съединения към други таблици и хей, скоро всичко работи! ;) - person Jimmy; 22.10.2009

Опитайте тази:

SELECT
   PropertyId,
   SUM(Amount) as TOTAL_COSTS
FROM
   MyTable
WHERE
   EndDate IS NULL
GROUP BY
   PropertyId
person gbn    schedule 22.10.2009
comment
Забравихте сума в SUM(). - person Peter Radocchia; 22.10.2009

имате предвид получаване на сума (Сума от всички типове) за всяко свойство, където EndDate е null:

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

звучи сякаш искаш нещо като:

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

Клаузата WHERE винаги се прилага концептуално (планът за изпълнение може да прави каквото иска, очевидно) преди GROUP BY. Трябва да е преди GROUP BY в заявката и действа като филтър преди нещата да бъдат SUMmed, което е начинът, по който работят повечето отговори тук.

Трябва също да сте наясно с незадължителната клауза HAVING, която трябва да е след GROUP BY. Това може да се използва за филтриране на получените свойства на групи след GROUPing - например HAVING SUM(Amount) > 0

person Cade Roux    schedule 22.10.2009

Използвайте общ израз на таблица, за да добавите общ общ ред, 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
person Joel    schedule 21.03.2015