Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Funkcja agregujaca
Forum PHP.pl > Forum > Bazy danych > Access
attimo
Przykładowa struktura:

ID, imie, wiek
1 Jan 24
2 Maria 45

Chciałbym wyswietlic najwyzszy wiek i zarazem imie przyporządkowane temu wiekowi. Czyli w tym przypadku 45 i imie Maria. Próbowałem zrobić to tak, ale nie chce działać.

  1. SELECT Imie, max(Wzrost) AS WW
  2. FROM NW


Pojawia się błąd:
"Próba wykonania kwerendy, która nie zawiera podanego wyrażenia 'imie' jako elementu funkcji agregującej."

Jakby się zastanowić to logiczne, ale jak rozwiązać ten problem ? jak wyszukac maksymalna wartosc i zwrocic poszczegolne pola rekordu.
Theqos
Order by + limit 1?
attimo
Tak też się da, ale powiedzmy, że jest taka sytacja

ID Imie Wiek Plec
1 Jan 24 M
2 Maria 45 K

i chce uzyc dwoch zapytan i zwrocic w jednym pliku czyli cos takiego:


  1. SELECT Imie
  2. FROM NW
  3. WHERE Plec="k"
  4. ORDER BY wiek;
  5. UNION
  6. SELECT Imie
  7. FROM NW
  8. WHERE Plec="m"
  9. ORDER BY wiek;


Czyli zwrocic najstarsza kobiete i najstarszego mężczyznę. strkutura pliku po zapytaniu miala by wygladac tak:

Imie wiek
cos jakiswiek
cos2 jakiswiek2

ale takie cos wywali blad i nie wiem jak to obejsc.
devnul
  1. SELECT Imie, wiek
  2. FROM NW
  3. WHERE Plec="k"
  4. ORDER BY wiek DESC LIMIT 1;
  5. UNION
  6. SELECT Imie, wiek
  7. FROM NW
  8. WHERE Plec="m"
  9. ORDER BY wiek DESC LIMIT 1;
attimo
Niestety takie coś wywala błąd. Problemem jest LIMIT 1 bo gdy to usune działa, ale oczywiscie pokazuje wtedy wszystkie a Ja chce tylko jeden dla kazdego warunku.

Błąd: "Błąd składniowy w klauzuli ORDER BY"

Z tym sobie poradzilem trzeba dac SELECT TOP 1, ale jak zrobie tak:

  1. SELECT TOP 1 Imie, wiek
  2. FROM NW
  3. WHERE Plec="k"
  4. ORDER BY wiek DESC;
  5. UNION
  6. SELECT TOP 1 Imie, wiek
  7. FROM NW
  8. WHERE Plec="m"
  9. ORDER BY wiek DESC;


To to pierwsze zwroci poprawnie a dla drugiego wybierze pierwszy rekord z bazy jak zamienia zapytania to dzieje sie tak samo czyli zawsze dla pierwszego wybiera prawidlowo a dla drugiego pierwsze zapytanie z bazy. dlaczego ?
devnul
uhh, sorry nie zauważyłem że temat w dziale Access. A nie możesz tego zwyczajnie rozbić na 2 zapytania?
attimo
Tylko jeśli chciałbym potem wyeksportować to do Excel-a zeby oba wyniki zapytan byly w jednym pliku czyli pierwszy zwroci najstarsza kobiete a drugi mezczyzne to jak to skleic do jednego pliku by bylo:
imie wiek
imie mezczyzny wiek
imie kobiety wiek

Chodzi o zadanie maturalne zadanie 6. trzeba podac w tym przyapdku imiona dzieci o najwyzszym wzroscie ale to tak samo jak z wiekiem i nie wiem, ale chyba trzeba to zrobic w jednym choc moge sie mylic.
Arkusz
devnul
możliwe że bredzę, nie mam nigdzie pod ręką accessa i nie za bardzo mam jak sprawdzić ale spróbuj czegoś takiego:
  1. SELECT TOP 1 Imie, wiek
  2. FROM NW
  3. WHERE Plec="k"
  4. ORDER BY wiek DESC;
  5. UNION ALL
  6. SELECT TOP 1 Imie, wiek
  7. FROM NW
  8. WHERE Plec="m"
  9. ORDER BY wiek DESC;

attimo
To nie pomogło niestety.

Wymyśliłem coś takiego, ale to działa poprawnie tylko dla pierwszego zapytania a w przypadku drugiego wybiera pierwszy rekord w tabeli a moim zdaniem powinien tez wynik swoich dzialan posortowac i wysiwetlic maxa a tak nie robi. Ktoś wie dlaczego ?

  1. SELECT TOP 1 NW.Imie, NW.Wiek
  2. FROM NW
  3. WHERE (((NW.[Plec])='m'))
  4. ORDER BY NW.Wiek DESC;
  5. UNION SELECT
  6. TOP 1 NW.Imie, NW.Wiek
  7. FROM NW
  8. WHERE (((NW.[Plec])='k'))
  9. ORDER BY NW.Wiek;


Może komuś się przyda:

kwarenda1:
  1. SELECT NW.plec, Max(NW.wzrost) AS MaksimumOfwzrost
  2. FROM NW
  3. GROUP BY NW.plec;


kwarenda2:
  1. SELECT NW.imie
  2. FROM NW INNER JOIN Kwerenda1 ON (NW.plec=[Kwerenda1].plec) AND (NW.wzrost=[Kwerenda1].MaksimumOfwzrost);


To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.