webForumDet fria alternativet

Slå ihop värden

PHPur PHP

21 svar · 450 visningar · startad av Web-Tor

Medlem sedan nov. 200013 890 inlägg
Frågan#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?

------------------
/Tor
www.tor.nu

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

------------------
essentitia preter non sans multiplicandum

[Redigerat av LarsG den 12 okt 2001]

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å?

------------------
/Tor
www.tor.nu

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.

------------------
essentitia preter non sans multiplicandum

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

------------------
/Tor
www.tor.nu

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.

------------------
essentitia preter non sans multiplicandum

Medlem sedan nov. 200013 890 inlägg
#7

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

------------------
/Tor
www.tor.nu

Medlem sedan jan. 2001795 inlägg
#8

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

------------------
Den som dricker själv har bara sig själv att fylla

Medlem sedan nov. 200013 890 inlägg
#9

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

------------------
/Tor
www.tor.nu

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

------------------
/Tor
www.tor.nu

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

------------------
essentitia preter non sans multiplicandum

[Redigerat av LarsG den 12 okt 2001]

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. :)

------------------
/Tor
www.tor.nu

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

------------------
/Tor
www.tor.nu

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>";
}

------------------
You can't be young forever, but you can be immature indefinitely.

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

------------------
/Tor
www.tor.nu

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

------------------
You can't be young forever, but you can be immature indefinitely.

[Redigerat av spango den 15 okt 2001]

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

------------------
/Tor
www.tor.nu

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... :)

------------------
SPiN, bjorne.w@telia.com

-- Den som går i andras fotspår kommer aldrig först --

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

------------------
essentitia preter non sans multiplicandum

Medlem sedan mars 20007 896 inlägg
#20

LarsG, han kan han! :o :)

------------------
SPiN, bjorne.w@telia.com

-- Den som går i andras fotspår kommer aldrig först --

[Redigerat av SPiN den 15 okt 2001]

262 ms totalt · 3 externa anrop · v20260731065814-full.b746b907
0 ms — hämta forumlista (cache)
120 ms — hämta statistik (db)
139 ms — hämta tråd, inlägg och bilagor (db)