Update + sumowanie innej tabeli

0

Dzień dobry, mam pewien problem. Dopiero zaczynam swoją przygodę z platformą SQL Server i mam pewien problem. Posiadam dwie tabele dbo.Występy oraz dbo.Punkty. W tabeli dbo.Punkty znajduje się ID oraz Suma punktów, a w dbo.Występy ID_występu, ID_meczu, ID oraz Liczba punktów. Chciałbym, aby w kolumnie Suma punktów znajdowała się suma zgromadzonych punktów na podstawie ID zawodnika (z tabeli dbo.Występy). Po dłuższych przeszukiwaniach sieci napisałem coś takiego:
[SQL]
update t1
set t1.[Suma punktów] = SUM (t2.[Liczba punktów])
FROM dbo.Punkty AS t1
INNER JOIN dbo.Występy AS t2
ON t1.ID = t2.ID;
[/SQL]

Wyskakuje błąd: 'An aggregate may not appear in the set list of an UPDATE statement.'
Czy mógłby mi ktoś podpowiedzieć jak poprawnie napisać to polecenie? Będę wdzięczny.

2

jeśli to Ty projektowałeś bazę to zapamiętaj sobie, że nazwy kolumn ze spacją i polskimi literami są ZŁE.

UPDATE
  dbo.punkty 
SET
  p.[suma punktów] = Sum(w.[liczba punktów])
FROM
  dbo.punkty AS p
INNER JOIN 
  dbo.występy AS w ON p.id = w.id
0

Dziękuję Ci bardzo za odpowiedź, niestety teraz pojawia mi się następujący błąd:
Msg 2809, Level 16, State 1, Line 1
The request for procedure 'Punkty' failed because 'Punkty' is a table object.

Jeżeli chodzi o nazwy występujące w bazie to dziękuję Ci bardzo za wskazówki, za moment to zmienię, gdyż baza jest robiona przeze mnie od podstaw. Niestety przez 3 lata studiów nikt nawet o tym nie napomniał...

0

jak to uruchamiasz?

0

Uruchamiałem to klikając 'Execute', aczkolwiek w tym momencie jeszcze raz odpaliłem program i przy próbie wykonania kodu pojawił mi się inny błąd niż wcześniej. Tym razem:
'Msg 4104, Level 16, State 1, Line 1
The multi-part identifier "p.suma punktów2" could not be bound.'

Mógłbyś mi coś podpowiedzieć?

1

to właśnie się dzieje jak używasz spacji w nazwie :p. Wszystkie nazwy ze spacjami i literami spoza podstawowego alfabetu (narodowe) muszą być w nawiasach kwadratowych []

0

Nazwy pozmieniane, lecz niestety nadal pojawia się ten sam błąd (The multi-part identifier "p.suma_punktow" could not be bound.). Po przerobieniu z p.suma_punktow na dbo.punkty.suma_punktow, czyli:

UPDATE
  dbo.punkty 
SET
  dbo.punkty.suma_punktow = SUM(w.liczba_punktow)
FROM
  dbo.punkty AS p
INNER JOIN 
  dbo.wystepy AS w ON p.id = w.id

Pojawia się 'Msg 157, Level 15, State 1, Line 4 An aggregate may not appear in the set list of an UPDATE statement.'

0

Czy może to być wina źle ustawionych kluczy, czy raczej ten komunikat się tego nie tyczy?

0

Znasz choć trochę angielski? Bez tego będzie Ci ciężko :(

Komunikat mówi o tym, że nie możesz tutaj użyć funkcji agregującej.

Alternatywa:

UPDATE p SET suma_punktow=liczba_punktow
FROM dbo.punkty p
JOIN (SELECT id,liczba_punktow=SUM(liczba_punktow) FROM dbo.wystepy GROUP BY id) w ON w.id=p.id
0

Nie chce mi się instalować SQL Servera, ale możesz to rozwiązać na co najmniej dwa inne sposoby:
http://sqlfiddle.com/#!3/33ae1/3

0

Mój problem został rozwiązany. Dziękuję za pomoc, koledzy!

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