SQL, określenie poprawności zapytania

0

Witam ;-)

Mam w bazie tabelę Osoby posiadającą różne kolumny,między innymi Osoby.imie, Osoby.nazwisko, Osoby.ID_mieszkania.
Wiem, że jeśli w tabeli tej wystąpią rekordy o takim samym imieniu i nazwisku, to oznaczają one jedną osobę.
Zadaniem moim jest poznać liczbę kobiet i liczbę mężczyzn w tabeli, operając się na tym, że imiona kobiet i tylko kobiet kończą się na *a

Teraz robię to tak:


SELECT *
FROM
(
	SELECT  
		Count(*) AS FACECI
	FROM
	(
		SELECT 
			DISTINCT *
		FROM
		(
		SELECT 
			Osoby.Imie,
			Osoby.Nazwisko
		FROM 
			Osoby
		) AS A
	)
	HAVING A.Imie NOT LIKE "*a"
) AS F,
(
	SELECT  
		Count(*) AS KOBIETY
	FROM
	(
		SELECT 
			DISTINCT *
		FROM
		(
		SELECT 
			Osoby.Imie,
			Osoby.Nazwisko
		FROM 
			Osoby
		) AS B
	)
	HAVING B.Imie LIKE "*a"
) AS K

Działać działa, ale czuję, że jest to zapewne bardzo brzydkie i nieoptymalne zapytanie.
Jak można coś takiego zrealizować najlepiej?

1
select distinct
  Imie,
  Nazwisko,
  sum(case when lower(substr(imie, length(imie), 1))) = 'a' then 1 else 0 end) kobiet,
  sum(case when lower(substr(imie, length(imie), 1))) = 'a' then 0 else 1 end) mezczyzn
from
  osoby

oczywiście nie wpadłeś na to aby napisać jaka baza więc nie wszędzie zadziała

BTW zrealizowanie tego na 4 podzapytaniach to "miszczostwo" :P

0

Działam pod MS Accesem 2007 (Twój zapis tam nie działa, jednakże dzięki za samą ideę), i wiem, że zapytanie w mojej formie jest "miszczowskie", bo jeśli chodzi o bazy danych to newbie jestem totalny ;-P
To w sumie nie ma być ładne i pro, ma działać, bo to zadania maturalne z infy, więc wystarczy żeby zwracało poprawny wynik.
Lecz jako że nie lubię robić rzeczy na odwal, to wiedząc, że prawie na pewno jest paskudne pod względem wydajności/konstrukcji zapytałem tutaj, jak mogłoby wyglądać w nie "miszczowskim" zapisie.

1

w accessie zamiast case musisz użyć iif zamiast length len a zamiast substr right oczywiście z odpowiednimi parametrami. Dodatkowo jeśli distinct w tym miejscu nie zadziała (chociaż powinien ale accessa nie używam) to możesz zrobić podzapytanie - coś w ten deseń

select
j.w.
from
(select distinct imie nazwisko)

0

Dziękuję za pomoc.

Działa mi ładnie zapis

SELECT 
  SUM(IIF(RIGHT(osoby.imie,1)='a', 1, 0) ) AS KOBIETY,
  SUM(IIF(RIGHT(osoby.imie,1)='a', 0, 1) ) AS FACECI
FROM
  (select distinct osoby.imie, osoby.nazwisko from osoby) 

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