Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Obliczanie średniej dla poszczególnych dat w przedziale czasu
Forum PHP.pl > Forum > Bazy danych > MySQL
slawekxx
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ć ?
toaspzoo
Kod
select avg(kolumna) from tabela
slawekxx
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. }
Smertius
  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
slawekxx
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ń
Smertius
  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ś?
slawekxx
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ć
maly_swd
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')


slawekxx
datę trzymam w standardowym formacie 2011-06-05 dla mysql , a teraz drugi problem jak obliczyć średnią dla poszczególnych miesięcy ?
maly_swd
podaj strukture tabeli... bo ostatnio daty trzymales w varchar().

  1. GROUP BY YEAR(date) , MONTH(date) ORDER BY YEAR(date) , MONTH(date)
slawekxx
teraz daty mam już w "datetime"
maly_swd
i co dziala, to co napisalem?
slawekxx
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
Smertius
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
slawekxx
to co mam zrobić ogólnie potrzebuje pola daty i czasu
Smertius
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
slawekxx
przypomni bo zaczynam się trochę gubić :-)
Smertius
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
slawekxx
a jak można wyświetlać tylko datę , bo przy średniej nie potrzebuję godziny ?
Smertius
Zwróć uwagę na funkcję DATE()
slawekxx
problem rozwiązany w ten sposób
  1. echo date("d-m-Y",strtotime($row['date']));



mam problem z wyświetleniem tylko dnia w zapytaniu nie wiem czy dobrze korzystam z zapytania DATE_FORMAT , nie wyświetla mi daty
  1. $query = ('SELECT name_pl,DATE_FORMAT(date,%d-%m-%Y), AVG(temperature) FROM dane_koncowe
  2. WHERE date BETWEEN "2011-06-04" AND "2011-06-12"
  3. AND region="Dodekanez" GROUP BY name_pl,DATE_FORMAT(date,%d-%m-%Y) ORDER BY name_pl,date');


A teraz powstał nowy problem przy takim zapytaniu do bazy mysql
  1. $query = ('SELECT name_pl, date,region, AVG(temperature) FROM dane_koncowe
  2. WHERE date BETWEEN "2011-06-04" AND "2011-06-30"
  3. GROUP BY region,name_pl,DATE(date) ORDER BY name_pl,region,date');
  4.  
  5. $result = mysql_query($query) or die(mysql_error());
  6.  
  7. // Print out result
  8. while($row = mysql_fetch_array($result)){
  9.  
  10. echo $row['region'];
  11. echo $row['name_pl'];
  12. echo date("d-m-Y",strtotime($row['date']));
  13. echo " ".round($row['AVG(temperature)'],2);
  14. echo "<br />";


wyświetla się tylko z kolumny name_pl tylko pierwsze miejscowość , która należy do określonego regionu. W regionie jest kilka miejscowości regionów jest kilka co robię źle ,że nie wyświetla mi się wszystkie miejscowości.
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.