Podstawy SQL - zapytanie AVG - problem z rozwiązaniem problemu

0

Cześć,
Zwracam się z prośbą o pomoc w nakierowaniu na jakiś pomocny artykuł, lub wskazaniu drogi do rozwiązania problemu. Mam problem z rozwiązaniem pewnego zadania, o ile w ogóle w tej konfiguracji tabeli jest ono do rozwiązania, przez kogoś kto zaczyna się tego uczyć.
Tabela ma strukturę :
(Student) (Ocena) (Ocena) (Ocena)
ID Indeks Przedmiot_1 Przedmiot_2 Przedmiot_3
1 18001 4 5 4
2 18002 5 4 3
3 18003 3 4 3
4 18004 3 3 3

Problem: Wyznacz średnią ocen dla każdego studenta z wszystkich przedmiotów.
Nie wiem jak sobie z tym poradzić. Przeczytałem już wiele kursów, artykułów itp. dotyczących tego zagadnienia, ale nie mogę jakoś tego w całość poskładać, czy jest to w ogóle do zrobienia dla początkującego w tym człowieka.

Pozdrawiam Serdecznie,
Piotrek

1

Zła struktura tabeli

0

@Marcin.Miga: ma racje, struktura jest zła, mozesz to wyrzeźbić np. tak

select indeks,(przedmiot1+przedmiot2+przedmit3)/3 srednia from tab

Alt to zadziała jeżeli wszystkie kolumny będą wypełnione, lepsza struktura jest tak

indeks, przedmiot, ocena
18001, przedmiot1, 4
18001, przedmiot2, 5
18001, przedmiot3, 4

i wtedy klasycznie:

select indeks, avg(ocena) from tab group by indeks
0

tsql ;)

SELECT   Id ,
         Indeks,
         AVG(Ocena) [Srednia]
FROM     @t1 t UNPIVOT(Ocena FOR Studenci IN(Przedmiot_1, Przedmiot_2, Przedmiot_3)) AS unpvt
GROUP BY unpvt.Id ,
         unpvt. Indeks;
1

Powinno zadzialac w mysql ;)

SELECT   Id ,
         Indeks ,
         AVG(Ocena) [Srednia]
FROM     (   SELECT Id ,
                    Indeks ,
                    'Przedmiot_1' Przedmiot ,
                    Przedmiot_1 AS Ocena
             FROM   @tabela
             UNION ALL
             SELECT Id ,
                    Indeks ,
                    'Przedmiot_2' Przedmiot ,
                    Przedmiot_2
             FROM   @tabela
             UNION ALL
             SELECT Id ,
                    Indeks ,
                    'Przedmiot_3' Przedmiot ,
                    Przedmiot_3
             FROM   @tabela ) t
GROUP BY t.Id ,t.Indeks;

lub

SELECT   t.Id ,
         t.Indeks ,
         AVG(CASE c.Przedmiot
                  WHEN 'Przedmiot_1' THEN Przedmiot_1
                  WHEN 'Przedmiot_2' THEN Przedmiot_2
                  WHEN 'Przedmiot_3' THEN Przedmiot_3
             END) Srednia
FROM     @tabela t
         CROSS JOIN (   SELECT 'Przedmiot_1' AS Przedmiot
                        UNION ALL
                        SELECT 'Przedmiot_2'
                        UNION ALL
                        SELECT 'Przedmiot_3' ) c
GROUP BY t.Id , t.Indeks;
0

Dziękuję za odpowiedzi.
Finalnie ze względu na mój poziom wiedzy w sql zmieniłem całkowicie strukturę tabeli .
Dziękuję za odpowiedzi !

Pozdrawiam,
Piotrek

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