Ograniczanie wyników wg danej kolumny.

0

Witam.

Nie wiedziałem jak sformułować temat...
Pisze z pytaniem czy da się w MSSQL zrobić coś takiego aby z np takiej tabeli:

NAZWA | ILOSC | GRUPA
JEDEN | 1 | PIERWSZA1 |
DWA | 1 | PIERWSZA1
JEDEN | 11 | PIERWSZA1
TRZY | 1 | PIERWSZA1
JEDEN | 1 | PIERWSZA1
CZTERY | 1 | PIERWSZA1
DWA | 4 | PIERWSZA1
ZIELONY | 1 | DRUGA2
CZERWONY | 1 | DRUGA2
CZERWONY | 4 | DRUGA2
NIEBIESKI | 3 | DRUGA2
NIEBIESKI | 6 | DRUGA2
ZIELONY | 1 | DRUGA2
ZIELONY | 1 | DRUGA2

Otrzymać taki wynik:
JEDEN | 13 | PIERWSZA1 |
DWA | 5 | PIERWSZA1
NIEBIESKI | 9 | DRUGA2
CZERWONY | 5 | DRUGA2

Czyli sumowanie ilości wg nazwy i grupowanie wg grupy (czyli group by) oraz : ograniczanie liczby rekordów w grupie do 2 - nie mam pojęcia jak to zrobić i czy da się to zrobić po stronie serwera.

Z góry dziękuję za pomoc.

0
select grupa, sum(ilosc), nazwa from tabela
group by grupa, nazwa

Ale tego ograniczania to raczej nie zrealizujesz po stronie sqla (przynajmniej nie bez rozszerzeń)

0

Da się -

sum()
1

To może tak (MSSQL):

WITH TOPTWO AS (
    SELECT grupa, SUM(ilosc) as suma, nazwa, ROW_NUMBER() 
    over (
        PARTITION BY grupa
        order by sum(ilosc) desc
    ) AS ROW 
    FROM table_1 group by grupa, nazwa 
)
SELECT * FROM TOPTWO WHERE ROW <= 2 
0

@fourfour wydaję się że Twój sposób działa :) (choć nie wiem jak będzie z wywołaniem takiego zapytania spod Lazarusa (sprawdziłem w ssms)).

0

Ja bym tak nie robił. Podmienisz bazę na inną i już takie TSQLowe rozwiązanie nie pójdzie ;)

0

@Shalom to prawda, jednak tag #mssql zobowiązuje ;-)

Edit: http://stackoverflow.com/ques[...]-10-records-for-each-category tu jest kilka podobnych przykładów, nie tylko z wykorzystaniem tsql.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0