Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Funkcja agregujaca
attimo
post
Post #1





Grupa: Zarejestrowani
Postów: 115
Pomógł: 6
Dołączył: 23.01.2010

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Theqos
post
Post #2





Grupa: Zarejestrowani
Postów: 49
Pomógł: 8
Dołączył: 5.12.2008

Ostrzeżenie: (0%)
-----


Order by + limit 1?
Go to the top of the page
+Quote Post
attimo
post
Post #3





Grupa: Zarejestrowani
Postów: 115
Pomógł: 6
Dołączył: 23.01.2010

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
devnul
post
Post #4





Grupa: Zarejestrowani
Postów: 1 470
Pomógł: 75
Dołączył: 21.09.2005
Skąd: że znowu

Ostrzeżenie: (0%)
-----


  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;


Ten post edytował devnul 23.09.2010, 15:34:58


--------------------
Profesjonaliści są przewidywalni...
strzeż się amatorów...
FL4SHB4CK - imprezy, galerie, lokale
Go to the top of the page
+Quote Post
attimo
post
Post #5





Grupa: Zarejestrowani
Postów: 115
Pomógł: 6
Dołączył: 23.01.2010

Ostrzeżenie: (0%)
-----


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 ?

Ten post edytował attimo 23.09.2010, 16:49:24
Go to the top of the page
+Quote Post
devnul
post
Post #6





Grupa: Zarejestrowani
Postów: 1 470
Pomógł: 75
Dołączył: 21.09.2005
Skąd: że znowu

Ostrzeżenie: (0%)
-----


uhh, sorry nie zauważyłem że temat w dziale Access. A nie możesz tego zwyczajnie rozbić na 2 zapytania?


--------------------
Profesjonaliści są przewidywalni...
strzeż się amatorów...
FL4SHB4CK - imprezy, galerie, lokale
Go to the top of the page
+Quote Post
attimo
post
Post #7





Grupa: Zarejestrowani
Postów: 115
Pomógł: 6
Dołączył: 23.01.2010

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
devnul
post
Post #8





Grupa: Zarejestrowani
Postów: 1 470
Pomógł: 75
Dołączył: 21.09.2005
Skąd: że znowu

Ostrzeżenie: (0%)
-----


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;



--------------------
Profesjonaliści są przewidywalni...
strzeż się amatorów...
FL4SHB4CK - imprezy, galerie, lokale
Go to the top of the page
+Quote Post
attimo
post
Post #9





Grupa: Zarejestrowani
Postów: 115
Pomógł: 6
Dołączył: 23.01.2010

Ostrzeżenie: (0%)
-----


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);


Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 11:28