Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> Obliczanie średniej dla poszczególnych dat w przedziale czasu
slawekxx
post
Post #1





Grupa: Zarejestrowani
Postów: 189
Pomógł: 2
Dołączył: 28.08.2010

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


Witam, wyskoczył mi tak mały problem chciałbym napisać zapytanie mysql o średnią z danej kolumny, a dokładniej z każdego dnia w przedziale czasu np. z ostatniego tygodnia czy miesiąca próbowałem za pomocą AVG ale pokazuje mi zawsze jeden wynik. Jak to zrobić ?
Go to the top of the page
+Quote Post
toaspzoo
post
Post #2





Grupa: Zarejestrowani
Postów: 778
Pomógł: 84
Dołączył: 29.07.2010
Skąd: Gliwice / Pławniowice Mistrz niezmordowanej klawiatury.

Ostrzeżenie: (20%)
X----


Kod
select avg(kolumna) from tabela
Go to the top of the page
+Quote Post
slawekxx
post
Post #3





Grupa: Zarejestrowani
Postów: 189
Pomógł: 2
Dołączył: 28.08.2010

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


Napisałem taki mały skrypt działa , oblicza średnią tylko dla jednego dnia jak napisać zapytanie do bazy aby obliczać poszczególne dni tygodnia ,

  1. $query = 'SELECT name_pl, AVG(temperature) FROM dane_koncowe WHERE region="Dodekanez" AND dzien="26-05-2011" GROUP BY name_pl';
  2.  
  3. $result = mysql_query($query) or die(mysql_error());
  4.  
  5. // Print out result
  6. while($row = mysql_fetch_array($result)){
  7. echo " ". $row['name_pl']. "Srednia temperatura ".$row['AVG(temperature)'];
  8. echo "<br />";
  9. }


Ten post edytował slawekxx 29.05.2011, 06:42:58
Go to the top of the page
+Quote Post
Smertius
post
Post #4





Grupa: Zarejestrowani
Postów: 156
Pomógł: 31
Dołączył: 23.02.2009
Skąd: Sanok

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


  1. SELECT AVG(temp) FROM tabela WHERE date BETWEEN 2011-05-01 AND 2011-05-30 GROUP BY date


To zapytanie wyświetli Ci średnią kolumny "temp" pogrupowaną wg dni
Go to the top of the page
+Quote Post
slawekxx
post
Post #5





Grupa: Zarejestrowani
Postów: 189
Pomógł: 2
Dołączył: 28.08.2010

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


w takim zapytaniu to działa ale jeżeli napiszę coś takiego
  1. ELECT AVG(temp) FROM tabela WHERE date BETWEEN 2011-05-01 AND 2011-05-30 GROUP BY date ,name_pl


gdzie name_pl to nazwy miejscowości to nie pokazuje mi średnich a wole mieć pogrupowane miejscowość - dzień
Go to the top of the page
+Quote Post
Smertius
post
Post #6





Grupa: Zarejestrowani
Postów: 156
Pomógł: 31
Dołączył: 23.02.2009
Skąd: Sanok

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


  1. SELECT name_pl, date, AVG(temp) FROM tabela WHERE date BETWEEN 2011-05-01 AND 2011-05-30 GROUP BY name_pl,date


Chodzi Ci chyba o takie coś?
Go to the top of the page
+Quote Post
slawekxx
post
Post #7





Grupa: Zarejestrowani
Postów: 189
Pomógł: 2
Dołączył: 28.08.2010

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


Prawie tylko coś dziwnego się dzieje bo wynik tego skryptu

  1. $query = ('SELECT name_pl,dzien, AVG(temperature) FROM dane_koncowe WHERE region="Dodekanez"
  2. AND dzien between "26-05-2011" and "28-05-2011" GROUP BY name_pl,dzien ORDER BY name_pl,dzien');
  3.  
  4. $result = mysql_query($query) or die(mysql_error());
  5.  
  6. // Print out result
  7. while($row = mysql_fetch_array($result)){
  8.  
  9. echo "". $row['name_pl'].$row['dzien'].round($row['AVG(temperature)'],2);
  10. echo "<br />";
  11. }


czyli wyświetlanie wygląda tak
  1. Kalymnos26-10-2010 21.86
  2. Kalymnos26-11-2010 19.43
  3. Kalymnos26-12-2010 19.59
  4. Kalymnos27-01-2011 9.65
  5. Kalymnos27-02-2011 12.33
  6. Kalymnos27-03-2011 15.86
  7. Kalymnos27-04-2011 17.63
  8. Kalymnos27-10-2010 21.59
  9. Kalymnos27-11-2010 20.8
  10. Kalymnos28-01-2011 14.05
  11. Kalymnos28-02-201112.68
  12. Kalymnos28-03-201115.9
  13. Kalymnos28-04-201118.5
  14. Karpathos26-05-201122.63
  15. Karpathos26-10-201023.24
  16. Karpathos26-11-201020.71
  17. Karpathos26-12-201019.18
  18. Karpathos27-01-201111.89
  19. Karpathos27-02-201114
  20. Karpathos27-03-201116.44
  21. Karpathos27-04-201117.94
  22. Karpathos27-05-201122.94
  23. Karpathos27-10-201022.42
  24. Karpathos27-11-201021.93
  25. Karpathos27-12-201018.44
  26. Karpathos28-01-201115.59
  27. Karpathos28-02-201113.44
  28. Karpathos28-03-201116.17
  29. Karpathos28-04-201118.25
  30. Karpathos28-05-201120.25
  31. Kassos26-10-201023.67
  32. Kassos26-11-201020.36
  33. Kassos26-12-201019.91
  34. Kassos27-01-201112.91
  35. Kassos27-02-201113.52
  36. Kassos27-03-201115.81
  37. Kassos27-04-201118.29
  38. Kassos27-10-201023.9
  39. Kassos27-11-201022.1
  40. Kassos27-12-201018.62
  41. Kassos28-01-201115.48
  42. Kassos28-02-201114
  43. Kassos28-03-201115.71
  44. Kassos28-04-201118.81
  45. Kos26-05-201121.81
  46. Kos26-10-201020.81
  47. Kos26-11-201018.23
  48. Kos27-01-20118.76
  49. Kos27-02-201111.33
  50. Kos27-03-201114.86
  51. Kos27-04-201116.38
  52. Kos27-05-201122.8
  53. Kos27-10-201020.57
  54. Kos27-11-201019.23
  55. Kos28-01-201111.37
  56. Kos28-02-201111.32
  57. Kos28-03-201114.55
  58. Kos28-04-201117.52
  59. Kos28-05-201120.6o


pokazuje mi średnie dla tych dni ale dla poszczególnych miesięcy od początku zapisu w bazie danych , chyba to jakiś efekt uboczny w zapytaniu jak to poprawić
Go to the top of the page
+Quote Post
maly_swd
post
Post #8





Grupa: Zarejestrowani
Postów: 744
Pomógł: 118
Dołączył: 14.02.2009
Skąd: poziome

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


w jakim formacie trzymasz date?
  1. SELECT name_pl, date, AVG(temp) FROM tabela WHERE STR_TO_DATE(date, '%d-%m-%Y') BETWEEN '2011-05-01' AND '2011-05-30' GROUP BY name_pl, STR_TO_DATE(date, '%d-%m-%Y')


Go to the top of the page
+Quote Post
slawekxx
post
Post #9





Grupa: Zarejestrowani
Postów: 189
Pomógł: 2
Dołączył: 28.08.2010

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


datę trzymam w standardowym formacie 2011-06-05 dla mysql , a teraz drugi problem jak obliczyć średnią dla poszczególnych miesięcy ?

Ten post edytował slawekxx 5.06.2011, 05:55:01
Go to the top of the page
+Quote Post
maly_swd
post
Post #10





Grupa: Zarejestrowani
Postów: 744
Pomógł: 118
Dołączył: 14.02.2009
Skąd: poziome

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


podaj strukture tabeli... bo ostatnio daty trzymales w varchar().

  1. GROUP BY YEAR(date) , MONTH(date) ORDER BY YEAR(date) , MONTH(date)
Go to the top of the page
+Quote Post
slawekxx
post
Post #11





Grupa: Zarejestrowani
Postów: 189
Pomógł: 2
Dołączył: 28.08.2010

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


teraz daty mam już w "datetime"
Go to the top of the page
+Quote Post
maly_swd
post
Post #12





Grupa: Zarejestrowani
Postów: 744
Pomógł: 118
Dołączył: 14.02.2009
Skąd: poziome

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


i co dziala, to co napisalem?
Go to the top of the page
+Quote Post
slawekxx
post
Post #13





Grupa: Zarejestrowani
Postów: 189
Pomógł: 2
Dołączył: 28.08.2010

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


no nie zupełnie przy zapytaniu do bazy
  1. SELECT name_pl,date AVG(temperature) FROM dane_koncowe
  2. WHERE date BETWEEN "2011-06-04" AND "2011-06-09"
  3. AND region="Dodekanez" GROUP BY name_pl,date ORDER BY name_pl,date


wynik wyświetlania jest taki "
Kalymnos2011-06-04 19:00:1626
Kalymnos2011-06-04 20:00:1224
Kalymnos2011-06-04 21:00:1324
Kalymnos2011-06-04 22:00:0324
Kalymnos2011-06-04 23:00:1224
Kalymnos2011-06-05 04:00:0921
Kalymnos2011-06-05 05:00:1521
"

po prostu wyświetla mi poszczególne godziny a średnią z dnia
Go to the top of the page
+Quote Post
Smertius
post
Post #14





Grupa: Zarejestrowani
Postów: 156
Pomógł: 31
Dołączył: 23.02.2009
Skąd: Sanok

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


Bo twoje pole date nie jest typu DATE tylko DATETIME.

  1. SELECT name_pl,DATE(date) AVG(temperature) FROM dane_koncowe
  2. WHERE date BETWEEN "2011-06-04" AND "2011-06-09"
  3. AND region="Dodekanez" GROUP BY name_pl,DATE(date) ORDER BY name_pl,date
Go to the top of the page
+Quote Post
slawekxx
post
Post #15





Grupa: Zarejestrowani
Postów: 189
Pomógł: 2
Dołączył: 28.08.2010

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


to co mam zrobić ogólnie potrzebuje pola daty i czasu
Go to the top of the page
+Quote Post
Smertius
post
Post #16





Grupa: Zarejestrowani
Postów: 156
Pomógł: 31
Dołączył: 23.02.2009
Skąd: Sanok

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


Albo rozbić to co masz w tej chwili na dwa osobne pola DATE oraz TIME, albo skorzystać z zapytania które podałem w poprzednim poście
Go to the top of the page
+Quote Post
slawekxx
post
Post #17





Grupa: Zarejestrowani
Postów: 189
Pomógł: 2
Dołączył: 28.08.2010

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


przypomni bo zaczynam się trochę gubić :-)
Go to the top of the page
+Quote Post
Smertius
post
Post #18





Grupa: Zarejestrowani
Postów: 156
Pomógł: 31
Dołączył: 23.02.2009
Skąd: Sanok

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


LOL

To zapytanie poniżej pogrupuje Ci wyniki po dacie. Zwróć uwagę na magiczną funkcję DATE()

  1. SELECT name_pl,DATE(date) AVG(temperature) FROM dane_koncowe
  2. WHERE date BETWEEN "2011-06-04" AND "2011-06-09"
  3. AND region="Dodekanez" GROUP BY name_pl,DATE(date) ORDER BY name_pl,date
Go to the top of the page
+Quote Post
slawekxx
post
Post #19





Grupa: Zarejestrowani
Postów: 189
Pomógł: 2
Dołączył: 28.08.2010

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


a jak można wyświetlać tylko datę , bo przy średniej nie potrzebuję godziny ?

Ten post edytował slawekxx 9.06.2011, 19:08:05
Go to the top of the page
+Quote Post
Smertius
post
Post #20





Grupa: Zarejestrowani
Postów: 156
Pomógł: 31
Dołączył: 23.02.2009
Skąd: Sanok

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


Zwróć uwagę na funkcję DATE()
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 22.08.2025 - 12:44