Slå ihop värden

PHP

21 svar · 455 visningar · startad av Web-Tor

Medlem sedan nov. 200013 890 inlägg
Trådstart#1

I en tabell har jag tre kolumner: Avdelning , Vecka och Status

Varannan vecka rapporterar varje avdelning sin status.

Nu vill jag få ut statusens medelvärde för varje vecka.

Ett exempel:
Vecka 12 rapporterar avdelning A en status på 50 och samma vecka rapporterar avdelning B en status på 100.

Det jag vill få fram är helt enkelt: Medelvärdet för vecka 12 är 75

Men hur gör jag för att få fram det?

Medlem sedan dec. 200012 464 inlägg
#2
select vecka,avg(status) from tabellen
 group by vecka

Du får kanske lägga in någon konvertering beroende på vilken typ du vill ha på resultatet. (Ser lite olika ut beroende på DBMS också.)

Red: detta tar fram avg för alla veckor, om du bara vill ha för en viss vecka

select avg(status) from tabellen 
where vecka = 12
Medlem sedan nov. 200013 890 inlägg
#3

Det var en variant som jag inte tänkt på. :)

Grejen är att jag inte vet hur många veckor det finns i databasen och det kan bli ganska många och då blir det ju en väldig massa frågor till databasen.

Jag hade tänkt mig ett sätt så att jag kan hämta all data från databasen och sedan räkna ut medelvärdet för varje vecka.

Någon lösning på det också?

Medlem sedan dec. 200012 464 inlägg
#4

Jag hade tänkt mig ett sätt så att jag kan hämta all data från databasen och sedan räkna ut medelvärdet för varje vecka.

Den första frågan,den med group by, räknar ut snittet för alla veckor.

Du kan ju använda den genomgående och sätta villkor på vecka om du vill begränsa urvalet.

Medlem sedan nov. 200013 890 inlägg
#5

Jag skulle behöva lite mer kod för att fatta hur du menar.

Hur få ut nåt vettigt från:

$result = mysql_query ("SELECT avg(Status) from tabell WHERE Vecka='12'");
Medlem sedan dec. 200012 464 inlägg
#6

Om du ställer den frågan så blir det bara en post som resultat.

$result = mysql_query ("SELECT avg(Status) as snitt from tabell WHERE Vecka='12'");

$row = mysql_fetch_array($result);
echo Snittet för vecka 12 är " . $row["snitt"] . "timmar <br>";

Däremot om du har

$result = mysql_query ("SELECT vecka,avg(Status) as snitt from tabell group by vecka");

while ($row = mysql_fetch_array($result)) {
echo Snittet för vecka " . $row["vecka"] . " är " . $row["snitt"] . "timmar <br>";
}

så får du en post per vecka.

Medlem sedan nov. 200013 890 inlägg
#7

Jag får "parse error" på raden som börjar på echo :q

Medlem sedan jan. 2001795 inlägg
#8

Saknas en " framför Snittet, tycker jag det ser ut som.

Medlem sedan nov. 200013 890 inlägg
#9

Det första man blir blind på är ögonen. ;) :x

Medlem sedan nov. 200013 890 inlägg
#10

Det funkar precis som jag vill nu men jag skulle behöva en grej till.

Om det blir väldigt många veckor skulle jag vilja dela upp det så att det bara visas typ 20 veckor åt gången.

Kan man använda detta som utgångspunkt kanske: http://cgi.webforum.nu/wf/Forum12/HTML/000457.html :q

Medlem sedan dec. 200012 464 inlägg
#11

Det gick lite för fort där i mitt förra inlägg, men det ordnade sig.

Limit och order by borde vara alldeles utmärkt för paging

Skicka sidnummer med querystring

//räkna ut antal sidor
  $sql = "select count(distinct vecka) as veckor from tabellen";
//...
  if (!isset($pageno)) $pageno = 1;
  if ( $pageno == "" ) $pageno = 1;
  $pagesize = 20;
  $offset = $pagesize*($pageno-1);
  $sql = "SELECT vecka,avg(Status) as snitt from tabell group by vecka order by vecka limit $offset,$pagesize");
//etc
Medlem sedan nov. 200013 890 inlägg
#12

Tack Lars!
Det funkar bra.
Jag återkommer säkert senare när jag stött på nya problem. :)

Medlem sedan nov. 200013 890 inlägg
#13

Nya problem. :(

Som det är nu så står det Välj sida [1, 2, 3, 4] längst ner på sidan.

Jag skulle vilja att det stod Välj intervall [ 10-20, 21-30, 31-40]

??? :q

Medlem sedan juni 20008 205 inlägg
#14

Typ...

// förutsättningar:
// $pagesize = antal grejer per sida
// $antal = antal tillgängliga grejer
// $pageno = nuvarande sida
for($i = 1; $i <= ((int)($antal / $pagesize)) + 1; $i++){
	if($i != 1)
		echo ", ";
	$lo = (($i - 1) * $pagesize) + 1;
	$hi = $i * $pagesize;
	if($hi > $antal)
		$hi = $antal;
	$linkDescription = "$lo-$hi";
	if($i == $pageno)
		echo $linkDescription;
	else
		echo "<a href='$PHP_SELF?pageno=$i'>$linkDescription</a>";
}
Medlem sedan nov. 200013 890 inlägg
#15

Nästan Spango ;)

Jag skulle vilja att det var veckonumnet som stod i länken.

Ett exempel:
Första veckan är 130 (vecka 30 år 2001) och sista vecka 146.

Vi visar 10 veckor per sida.

Länken skall då bli Välj intervall [ 130-139, 140-146 ]

Jag har en array där alla veckorna ligger om det kan vara till någon hjälp. ;)

Medlem sedan juni 20008 205 inlägg
#16

Det är inte "min dag" i den här tråden :)
Jag skulle förslå en viss omstrukturering... stoppa in den första veckan du vill visa info för i querystring-variabeln first_display, så att foo.php?first_display=141 visar veckorna 141 till 150, eller något.

define('STEP_WEEK', 10); // antal veckor per sida
$last_display = $first_display + STEP_WEEK - 1; // sista veckan att visa data för
$conn = mysql_connect('databasserver');
mysql_select_db('tors_databas');
$res = mysql_query('SELECT MIN(vecka) as first, MAX(vecka) AS last FROM tabell'); // plocka fram första resp. sista veckan
$row = mysql_fetch_assoc($res);
mysql_free_result($res);
define('FIRST_WEEK', $row['first']);
define('LAST_WEEK', $row['last']);

# steg 1: visa data
$weekAvgs = mysql_query("SELECT vecka, AVG(status) FROM tabell WHERE vecka BETWEEN $first_display[/red] AND $last_display", $conn);
while($row = mysql_fetch_assoc($weekAvgs)){
# skriv ut raden
}
mysql_free_result($weekAvgs);

mysql_close($conn);

# steg 2: skriv ut navigeringshjälp
for($i = FIRST_WEEK; $i <= LAST_WEEK; $i += STEP_WEEK){
if($i != FIRST_WEEK)
echo ', ';
$linkDesc = ($i == LAST_WEEK) ? $i : $i . '-' . min($i + STEP_WEEK - 1, LAST_WEEK);
if($i >= $first_display && $i <= $last_display)
echo $linkDesc;
else
echo "<a href='$PHP_SELF?first_display=$i'>$linkDesc</a>"
}

Typ ;)

Medlem sedan nov. 200013 890 inlägg
#17

Jag kan inte få den här raden att funka.
Alla variabler som är med i fråga har rätt värde men det funkar inte ändå??? :x

$weekAvgs = mysql_query("SELECT vecka, AVG(status) FROM tabell WHERE vecka BETWEEN $first_display AND $last_display", $conn) or die ("Fel");
Medlem sedan mars 20007 896 inlägg
#18

Vad får du för felmeddelande?

Jag har fått för mig att BETWEEN endast fungerar på SQL Server och i Access, och inte i MySQL. Ska kolla upp det åt dej, vänta lite... :)

Medlem sedan dec. 200012 464 inlägg
#19

Du saknar en group by vecka i sql-satsen.

$weekAvgs = mysql_query("SELECT vecka, AVG(status) FROM tabell WHERE vecka BETWEEN $first_display AND $last_display group by vecka", $conn) or die (mysql_error());
Medlem sedan mars 20007 896 inlägg
#20

LarsG, han kan han! :o :)

272 ms totalt · 4 externa anrop · v20260731065814-full.d34c6d5a
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
137 ms — hämta tråd, inlägg och bilagor (db)
132 ms — ändringar (db)