Znajdz harcerzy,którzy podjeli dzialania w celu zdobycia największej liczby różnych sprawności.

0

Witam, siedzę i głowie się cały dzień nad zadaniem z matury 2018.

Zadanie 4.3.
Znajdź harcerzy, którzy podjęli działania w celu zdobycia największej liczby różnych sprawności. Dla każdego z nich podaj jego imię i nazwisko oraz sprawności, które próbował zdobyć.

Tabele:

Próbuje cały dzień i jedyne co udało mi się zwrócić to lista Harcerzy ze zliczonymi sprawnościami ale nie unikalnymi.

Kod:

SELECT w.Id_harcerza, Sum( w.Count) AS SumOfCount FROM (SELECT C.Id_harcerza, S.Nazwa_sprawnosci,
COUNT( S.Nazwa_sprawnosci) as count FROM ( Harcerze AS U INNER JOIN Dzialania AS C ON U.Id_harcerza = C.Id_harcerza)
INNER JOIN Sprawnosc AS S ON C.Id_sprawnosci = S.Id_sprawnosci GROUP BY C.Id_harcerza,S.Nazwa_sprawnosci)
AS w GROUP BY w.Id_harcerza;
1

Grupujesz po id harcerza i zliczasz unikatowe id sprawnosci

W sensie distinct https://www.w3resource.com/sql/aggregate-functions/count-with-distinct.php

0

Myślałem by tak zrobić tylko ogranicza mnie MS-Access gdzie nie można używać składni COUNT(DISTINCT etc)

0

Musi to być w ACCESSIE, nie możesz użyć innej bazy danych?

0

A no tak. Produkty microsoftu jak zwykle wszystko komplikuja.

0

Niestety musi być w tym środowisku.

Stąd to podzapytanie, jest to niby sposób na uzyskanie efektu takiego samego jak COUNT(DISTINCT)

SELECT Harcerze.Id_harcerza,COUNT(Dzialania.Id_sprawnosci)
FROM (SELECT DISTINCT Dzialania.Id_sprawnosci FROM Dzialania ),Sprawnosc
INNER JOIN (Harcerze INNER JOIN Dzialania ON Harcerze.Id_harcerza = Dzialania.Id_harcerza)
ON Sprawnosc.Id_sprawnosci = Dzialania.Id_sprawnosci
GROUP BY Harcerze.Id_harcerza

Tylko teraz zwraca mi tego counta pomnożonego przez 6, co daje 54 więc 54/6 = 9 więc nadal nie zbiera unikalnych bo powinno być maksymalnie 5

A gdy zrobie bez innerów to każdemu zwraca 6 czyli jakby pobierało bezpośrednio zawsze wszystkie sprawności jakie tylko są,

SELECT Harcerze.Id_harcerza,COUNT(Dzialania.Id_sprawnosci)
FROM (SELECT DISTINCT Dzialania.Id_sprawnosci FROM Dzialania),Harcerze
GROUP BY Harcerze.Id_harcerza
0

W zlym miejscu robisz distinct/joina

FROM (SELECT DISTINCT Dzialania.Id_sprawnosci FROM Dzialania )

Tutaj masz zle. I to sprawia ze dalej tez masz zle.

0

@stivens: Nie potrafie tego naprawić.

Coś takiego myślałem ale nic nie zwraca.

SELECT Harcerze.Id_harcerza,COUNT(Dzialania.Id_sprawnosci)
FROM (SELECT DISTINCT Dzialania.Id_sprawnosci FROM Sprawnosc INNER JOIN (Harcerze INNER JOIN Dzialania ON Harcerze.Id_harcerza = Dzialania.Id_harcerza) ON Sprawnosc.Id_sprawnosci = Dzialania.Id_sprawnosci )
GROUP BY Harcerze.Id_harcerza

0

Udało mi się zwrócić te dwie osoby które faktycznie zgadzają sie z rozwiązaniem, teraz tylko jak wypisać wszystkie sprawnosci po nazwie wraz z nimi.
Bo teraz zwraca | Imie | nazwisko | ile sprawnosci |

select top 2 t.imie,t.nazwisko ,count(*)
  from (
  select distinct Dzialania.Id_sprawnosci,Harcerze.Imie,Harcerze.Nazwisko,Sprawnosc.Nazwa_sprawnosci
  from  Dzialania,Sprawnosc,Harcerze WHERE Dzialania.Id_sprawnosci=Sprawnosc.Id_sprawnosci AND Harcerze.Id_harcerza=Dzialania.Id_harcerza
  ) t

  group by t.imie,t.nazwisko
order by count(*) desc

EDIT1: Prawie sie udalo

Zwraca 6 nie 5 nazw sprawnosci czyli nie sa unikalne ;\ a juz myslalem ze sie udalo

select top 2 t.imie,t.nazwisko,Nazwa_sprawnosci
  from (
  select distinct Dzialania.Id_sprawnosci,Harcerze.Imie,Harcerze.Nazwisko
  from  Dzialania,Sprawnosc,Harcerze WHERE Dzialania.Id_sprawnosci=Sprawnosc.Id_sprawnosci AND Harcerze.Id_harcerza=Dzialania.Id_harcerza
  ) t,Sprawnosc
  

  group by t.imie,t.nazwisko,nazwa_sprawnosci
order by count(*) desc

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