Beste,

ik heb volgende code:


if(isset($_POST[invoeren2])) {

$maand=$_POST[maand];
$dag=$_POST[dag];
$dagtwee=$_POST[dagtwee];
$jaar=$_POST[jaar];
$jaartwee=$_POST[jaartwee];
$maandtwee=$_POST[maandtwee];
$maanden_jaar=$_POST[maand]-1;
$maandentwee_jaar=$_POST[maandtwee]-1;
$noemer = 2;
$deler = 4;


$maanden = array('januari', 'februari', 'maart', 'april', 'mei', 'juni', 'juli', 'augustus', 'september', 'oktober', 'november', 'december'); 
$test=$maanden[$maanden_jaar];
$testtwee=$maanden[$maandentwee_jaar]; 


echo "<center><h2><u>Overzicht van de cheque's tussen $dag $test $jaar en $dagtwee $testtwee $jaartwee</h2><br/>";

$query57 = "select * , SUM(aantal_uren) FROM structuurhcs WHERE datum BETWEEN '$jaar%-$maand%-$dag% 00:00' AND '$jaartwee%-$maandtwee%-$dagtwee% 23:59' group by naam"; 
	 
$res = mysql_query($query57) or die(mysql_error());


    if ($res && mysql_num_rows($res) >= 1)
    {


        echo '<table border="5">
            <tr>
                <td>naam</td>
		<td>volgens database </td> 
		<td>Volgens cheques </td>
		<td>verschil </td>
               
            </tr>';
        
        while ($row = mysql_fetch_array($res))
        {
	$info=$row['naam'];
            echo '<tr><td>'.$row['naam'].'</td>';
	    echo '<td>'.$row['SUM(aantal_uren)'].'</td>';
	    echo "<td><input type='text' size='3' name='". $row['id']."' ></td> ";	 
	    echo  '<td>hier moet de uitkomst komen</td>';   
        }

        echo '</table></center>';

}

//////////////////////////////////////////////////// totaal

$query = "SELECT SUM(aantal_uren) FROM structuurhcs WHERE datum BETWEEN '$jaar%-$maand%-$dag% 00:00' AND '$jaartwee%-$maandtwee%-$dagtwee% 23:59'";
$result = mysql_query($query);
$row = mysql_fetch_assoc( $result );
echo '<center><b>Totaal aantal uren: '.$row['SUM(aantal_uren)'].'</b></center>';



wat resulteert in het volgende:

http://coryn.eu/dbresult.JPG

zoals je ziet bij de kolom volgens database staat de SOM van de uren ingegeven tussen de datums die men wenst. en hiernaast staat iedere keer een BOX met als "name" het "ID" van de naam. Het is de bedoeling dat men in deze box het resultaat invult die men op papier heeft. en hieronder moet dan een submit knop komen om dan het verschil te berekenen en die moet in de kolom VERSCHIL komen.

Maar ik heb TOTAAL geen id hoe ik hieraan begin.

Kunnen jullie mij helpen ?
ok

ik begrijp het probleem.
Ik onderschat Frank ook zeker niet maar ik mag toch mijn mening hebben he ;). ik groepeer op namen maar ik heb verschillende datum's, uren, id's,....

Maar hoe moet ik dan groeperen per naam ? met de disctinct functie ?
mathias schreef op 28.12.2008 13:24
Maar hoe moet ik dan groeperen per naam ? met de disctinct functie ?
Nee, je zult dus al verschillende queries moeten gebruiken. Een query waarin je de naam en de som selecteert en groepeert op de naam en een query waarin je alle records selecteert.

Het is gewoon onmogelijk om die twee vragen in dezelfde query te proppen...
zoals dit dan ?

select * from structuurhcs

en:

select naam , SUM(aantal_uren) FROM structuurhcs WHERE datum BETWEEN '$jaar%-$maand%-$dag% 00:00' AND '$jaartwee%-$maandtwee%-$dagtwee% 23:59' group by naam
ik groepeer op namen maar ik heb verschillende datum's, uren, id's,....
Dat kan dus niet, je moet op alle kolommen groeperen die niet in een aggregate functie staan.

Gebruik dus NOOIT meer een * in een SELECT-query, maar benoem altijd de kolommen die je nodig hebt. Dat is sneller bij het uitvoeren van de query en 100x sneller bij het schrijven, testen en debuggen van je queries. Maak hier geen enkele uitzondering op, tenzij je onzinnig veel uren kwijt wilt zijn aan het schrijven van SQL.


SELECT
  kolomA,
  kolomB,
  SUM(kolomC) AS sommatie
FROM
  tabelnaam
GROUP BY
  kolomA,
  kolomB

En ziedaar de diverse VERPLICHTE!!! kolommen in de GROUP BY. Zodra je hier minder kolommen hebt staan dan er in het select gedeelte (buiten de aggregatie functies), is de query per definitie fout.

Lukraak distinct roepen gaat ook niet helpen, distinct verbergt vaak ook bugs. Lost ze dus niet op.

Ga eerst eens met SQL uitvogelen welke gegevens je nodig hebt en hoe je die 1-voor-1 kunt opvragen. Vervolgens kun je de boel eventueel gaan samenvoegen zodat je wat minder queries overhoudt, maar dat mag geen doel op zich zijn. Zorg er wel voor dat je de database eerst gaat configureren, anders weet je nog steeds niet of je resultaten wel correct zijn.
dus als ik:

SELECT
id
naam
naamklant
datum
uitgeschreven
uitgeschreven_door
ingevoerd_Door
SUM(aantal_uren) AS sommatie
FROM
structuurhcs
GROUP BY
naam
id
naamklant
datum
uitgeschreven
uitgeschreven_door
ingevoerd_Door

dan moet lukken dat ik 1x de naam krijg en alle uren opgeteld ?
Dat zal alleen het geval zijn als voor alle records de inhoud van de overige kolommen allemaal hetzelfde is. Maar dat lijkt me niet het geval en dus is deze query ook onjuist.

Misschien is het handig als je eerst eens probeert te begrijpen wat die GROUP BY nu precies doet, het lijkt er namelijk op dat je dat nog niet helemaal snapt. Pas als je dat door hebt, zul je hem ook op een goede manier kunnen toepassen.

De handleiding die je zelf al gevonden hebt, kan je daar zeker bij helpen. Zorg er dan alleen wel voor dat je hem helemaal leest en begrijpt.

Jouw probleem zijn twee verschillende vragen aan de database, allereerst de som van het aantal uren van verschillende namen en daarnaast alle gegevens van alle werknemers. Daar heb je toch echt twee verschillende queries voor nodig...
Nee, dat verwacht ik niet, zeker niet omdat je het id van een record opvraagt. En omdat ieder record zijn eigen id heeft, zul je dus groepjes aanmaken die slechts 1 record betreffen. Het opvragen van het id lijkt mij dan ook niet gewenst. Althans niet in de query waar je de sommatie doet.

Zoals ik reeds eerder schreef, ik verwacht dat je meerdere losse queries nodig zult hebben om de gewenste resultaten te krijgen.
ok, ik zal eerst een de volledige DB overzetten op mijn persoonlijke server. en testen met die "SET GLOBAL sql_mode = 'ONLY_FULL_GROUP_BY'"

bedankt voor de info.

Reageren