2012-07-06 16 views
12

Przeczytałem już (this), ale nie mogłem znaleźć sposobu na zaimplementowanie go do określonego problemu. Wiem, że SUM() jest funkcją agregującą i nie ma sensu nie używać jej jako takiej, ale w tym konkretnym przypadku muszę uzyskać wszystkie wyniki z zachowaniem każdego wiersza.Korzystanie z funkcji SUMA() bez grupowania wyników

Oto tabela:

--ID-- --amount-- 
    1  23 
    2  11 
    3  8 
    4  7 

muszę SUM() kwoty, ale zachować każdy rekord, więc wyjście powinno być tak:

--ID-- --amount-- 
    1  49 
    2  49 
    3  49 
    4  49 

miałem tej kwerendy, ale tylko sumy w każdym wierszu, nie wszystkie wyniki ze sobą:

SELECT 
    a.id, 
    SUM(b.amount) 

FROM table1 as a 
JOIN table1 as b ON a.id = b.id 
GROUP BY id 

bez SUM() I t zwróciłby tylko jeden wiersz, ale muszę zachować wszystkie identyfikatory ...

Uwaga: Tak, to jest całkiem prosty przykład i mogę użyć php, aby to zrobić tutaj, ale oczywiście stół jest większy i ma więcej wiersze i kolumny, ale nie o to chodzi.

Odpowiedz

12
SELECT a.id, b.amount 
FROM table1 a 
CROSS JOIN 
(
    SELECT SUM(amount) amount FROM table1 
) b 

Trzeba wykonać cartesian join wartości sumy każdego wiersza w tabeli dla każdego id. Ponieważ istnieje tylko jeden wynik podselekcji (49), w zasadzie po prostu zostaje on przypięty do każdego id.

+0

Geniusz! Dzięki za to :) – Anonymous

5

Dołącz oryginalny stół do sumy z podzapytania:

SELECT * FROM table1, (SELECT SUM(amount) FROM table1 AS amount) t 
+0

@Bohemian, przyjrzeć się bliżej, podzapytanie nie jest w 'klauzuli SELECT' ale jest w rzeczywistości część klauzuli "OD", która tworzy produkt kartezjański. Wykonuje się tylko raz. –

+0

@ZaneBien prawy - usunąłem mój komentarz – Bohemian

0

to robi tylko jeden sum() zapytanie, więc powinien wykonać OK:

SELECT a.id, b.amount 
FROM table1 a 
cross join (SELECT SUM(amount) as amount FROM table1 AS amount) b 
5

z MS SQL można używać OVER()

select id, SUM(amount) OVER() 
from table1 



select id, SUM(amount) OVER() 
from (
    select 1 as id, 23 as amount 
    union all 
    select 2 as id, 11 as amount 
    union all 
    select 3 as id, 8 as amount 
    union all 
    select 4 as id, 7 as amount 
) A 

enter image description here

--- OVER PODZIAŁU ID
DZIAŁANIE, które jest bardzo przydatne, gdy chcesz zrobić SUM() za MIESIĄC na przykład lub czy raporty kwartalne sprzedaży s lub roczne ... (Uwaga potrzebuje odrębny robi dla wszystkich wierszy)

select distinct id, SUM(amount) OVER(PARTITION BY id) as [SUM_forPARTITION] 
from (
    select 1 as id, 23 as amount 
    union all 
    select 1 as id, 23 as amount 
    union all 
    select 2 as id, 11 as amount 
    union all 
    select 2 as id, 11 as amount 
    union all 
    select 3 as id, 8 as amount 
    union all 
    select 4 as id, 7 as amount 
) OverPARTITIONID 

enter image description here

+0

Muszę się mylić, ale czy poważnie wypisałeś każdą wartość z bazy danych? To nie jest zbyt programowe i dlatego nie jest zbyt pomocne. – Anonymous

+0

jest to przykład, możesz zastąpić "Z (...) złożonym zapytaniem. Drugi przykład dotyczy PARTYCJI BY, co jest bardzo przydatne, gdy chcesz wykonać SUM() na MIESIĄC na przykład –

Powiązane problemy