PB avec fonction SUM() ???

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : PB avec fonction SUM() ???

par FAbrice » 17 févr. 2005, 00:21

alut,

ayé, ca marche.... mais maintenant je en vois plus les dossiers qui ont des points enregistrés!!! :D

en fait, ca m'arrange comme ca, je peux faire 2 tableaux :P

en tout cas,
merci de votre aide,
FAb

par FAbrice » 15 févr. 2005, 23:23

re re,

en fait, la requete que tu ne comprends pas, c "l'essai" et la mise en application de la fonction SUM et Left Join d'apres ta 1ere réponse mais totalement au feeling :oops:

j'essaie demain matin tes nouvelles propositions (et si tu en as d'autres, n'hésite pas :D )

merci de ton aide en tout cas,
FAb (qui galère encore pas mal avec PHP!!!)

par Hubert Roksor » 15 févr. 2005, 23:11

Plus je lis cette requête et moins j'y comprends quelque chose:

Code : Tout sélectionner

LEFT JOIN points p ON p.ID = r.ID WHERE p.ID IS NULL AND r.ID = p.Numdossier
Si tu demandes "p.ID IS NULL" ça veut dire qu'il n'existe pas d'enregistrement dans la table p répondant à ces critères, donc p.Numdossier sera NULL aussi et ta requête ne retournera donc aucun enregistrements.

par Hubert Roksor » 15 févr. 2005, 23:08

voici les parties interressantes du code:
Par "partie intéressante" je pense plutôt à la ligne qui produit l'erreur, ainsi que celles qui y sont directement impliquées, pas tout ton code :lol:

De plus, pour une meilleure lisibilité prends l'habitude de décomposer tes requêtes en plusieurs lignes et utilise des aliases pour les tables. Si tu sélectionnes de nombreux champs tu peux placer les champs de chaque table sur une ligne différentes. En plus de ça, personnellement j'ai tendance à lister les tables (dans "FROM") dans l'ordre dans lequel elles seront lues. Accessoirement ça accélère très légèrement les requêtes, mais c'est tout à fait optionnel.

En reformatant ta requête j'ai remarqué que tu listais deux fois la table points, l'erreur doit venir de là.

Code : Tout sélectionner

SELECT r.NumOT, r.NumPompe, r.Marques, r.Models, r.Datedebut, r.Cloture, r.NumDossier, mo.Models, ma.Marques, SUM(p.Points) FROM registre r, models mo, marques ma LEFT JOIN points p ON p.ID = r.ID WHERE p.ID IS NULL AND r.ID = p.Numdossier AND r.Marques = ma.ID AND r.Models = mo.ID GROUP BY r.Numdossier ORDER BY r.NumDossier
De plus, je vois que le même champs apparait plusieurs fois dans la partie "SELECT", un seul des champs portant le même nom sera retourné donc tu ferais mieux d'en éliminer (ou renommer) l'un des deux: r.Marques / ma.Marques et r.Models / mo.Models

par FAbrice » 15 févr. 2005, 20:55

re,

je viens d'essayer d'inserer "join left" mais j'ai un souci car il m'indique l'erreur 1064! :evil:

Voici ce que j'ai rentré:
$query_registrepoints = "SELECT registre.NumOT, registre.NumPompe, registre.Marques, registre.Models, registre.Datedebut, registre.Cloture, models.Models, marques.Marques, registre.NumDossier, SUM(points.Points) FROM points, registre, models, marques LEFT JOIN points ON points.ID=registre.ID WHERE (points.ID IS NULL) and (registre.ID=points.Numdossier) and (registre.Marques=marques.ID) AND (registre.Models=models.ID) GROUP BY registre.Numdossier ORDER BY registre.NumDossier"; 
est ce que quelqu'un aurait une idée???

FAb

par FAbrice » 15 févr. 2005, 19:03

Salut Hubert Roksorv.

voici les parties interressantes du code:
<?php require_once('../../Connections/ateliermeca.php'); ?> 
<?php 
$maxRows_registrepoints = 10; 
$pageNum_registrepoints = 0; 
if (isset($_GET['pageNum_registrepoints'])) { 
  $pageNum_registrepoints = $_GET['pageNum_registrepoints']; 
} 
$startRow_registrepoints = $pageNum_registrepoints * $maxRows_registrepoints; 

mysql_select_db($database_ateliermeca, $ateliermeca); 
$query_registrepoints = "SELECT registre.NumOT, registre.NumPompe, registre.Marques, registre.Models, registre.Datedebut, registre.Cloture, models.Models, marques.Marques, registre.NumDossier, SUM(points.Points) FROM points, registre, models, marques WHERE (registre.ID=points.Numdossier) and (registre.Marques=marques.ID) AND (registre.Models=models.ID) GROUP BY registre.Numdossier ORDER BY registre.NumDossier"; 
$query_limit_registrepoints = sprintf("%s LIMIT %d, %d", $query_registrepoints, $startRow_registrepoints, $maxRows_registrepoints); 
$registrepoints = mysql_query($query_limit_registrepoints, $ateliermeca) or die(mysql_error()); 
$row_registrepoints = mysql_fetch_assoc($registrepoints); 

if (isset($_GET['totalRows_registrepoints'])) { 
  $totalRows_registrepoints = $_GET['totalRows_registrepoints']; 
} else { 
  $all_registrepoints = mysql_query($query_registrepoints); 
  $totalRows_registrepoints = mysql_num_rows($all_registrepoints); 
} 
$totalPages_registrepoints = ceil($totalRows_registrepoints/$maxRows_registrepoints)-1; 
?> 

...

<p><span class="titrezone">Dossiers existants dans la Base de DonnEes:</span><br> 
    <span class="attention">ATTENTION: seuls les OT dont les points &eacute;t&eacute; remplis dans la section FDT apparaissent</span><br> 
</p> 

<table border="1"> 
  <tr> 
    <td width="110">NumOT</td> 
    <td width="100">NumPompe</td> 
    <td width="100">Marques</td> 
    <td width="100">Models</td> 
    <td width="200">Datedebut</td> 
    <td width="100">Cloture</td> 
    <td>NumDossier</td> 
    <td>SUM(points.Points)</td> 
  </tr> 
  <?php do { ?> 
  <tr> 
    <td width="110"><?php echo $row_registrepoints['NumOT']; ?></td> 
    <td width="100"><?php echo $row_registrepoints['NumPompe']; ?></td> 
    <td width="100"><?php echo $row_registrepoints['Marques']; ?></td> 
    <td width="100"><?php echo $row_registrepoints['Models']; ?></td> 
    <td width="200"><?php echo $row_registrepoints['Datedebut']; ?></td> 
    <td width="100"><?php echo $row_registrepoints['Cloture']; ?></td> 
    <td><?php echo $row_registrepoints['NumDossier']; ?></td> 
    <td><?php echo $row_registrepoints['SUM(points.Points)']; ?></td> 
  </tr> 
  <?php } while ($row_registrepoints = mysql_fetch_assoc($registrepoints)); ?> 
</table> 
</p> 

par Hubert Roksor » 15 févr. 2005, 17:23

Je dois dire que je n'ai pas lu ton script parce qu'il y a trop de code, si tu as un problème contente-toi de ne poster que la partie du code qui s'y rapporte, en t'assurant que ton code est suffisament aéré (=lisible pour celui qui ne le connait pas).

D'après ta description il semblerait que tu fasse une jointure vers une table et que cette jointure élimine certains enregistrements. Si c'est le cas, il s'agit de (My)SQL, si tu as d'autres problèmes du genre tu ferais mieux de poster dans le forum approprié. Dans le cas présent, je te conseille d'essayer un "LEFT JOIN" [ manuel ].

Exemple:

Code : Tout sélectionner

SELECT t1.*, SUM(t2.points) AS total FROM table1 t1, table2 t2 WHERE t2.id = t1.id
devient

Code : Tout sélectionner

SELECT t1.*, SUM(t2.points) AS total FROM table1 t1 LEFT JOIN table2 AS t2 ON (t2.id = t1.id)
Pour remplacer les NULL par la valeur 0 tu peux utiliser la fonction COALESCE:

Code : Tout sélectionner

SELECT t1.*, COALESCE(SUM(t2.points), 0) AS total FROM table1 t1 LEFT JOIN table2 AS t2 ON (t2.id = t1.id)

PB avec fonction SUM() ???

par FAbrice » 15 févr. 2005, 14:21

Bonjour le forum,

hier, j'avais un pb pour obtenir la somme de mes points en fonction des dossiers. ce pb est résolut mais m'a généré un autre souci.
en effet, j'obtiens bien ma somme des points par dossiers mais le probleme et que si j'enregistre un nouveau dossier, le nombre correspondant n'existe pas car aucune opération n'a encore était saisie (dans la table "points").
Le nouveau dossier n'est donc pas visible lors de ma consultation dont voici le code:
<?php require_once('../../Connections/ateliermeca.php'); ?>
<?php
$maxRows_registrepoints = 10;
$pageNum_registrepoints = 0;
if (isset($_GET['pageNum_registrepoints'])) {
  $pageNum_registrepoints = $_GET['pageNum_registrepoints'];
}
$startRow_registrepoints = $pageNum_registrepoints * $maxRows_registrepoints;

mysql_select_db($database_ateliermeca, $ateliermeca);
$query_registrepoints = "SELECT registre.NumOT, registre.NumPompe, registre.Marques, registre.Models, registre.Datedebut, registre.Cloture, models.Models, marques.Marques, registre.NumDossier, SUM(points.Points) FROM points, registre, models, marques WHERE (registre.ID=points.Numdossier) and (registre.Marques=marques.ID) AND (registre.Models=models.ID) GROUP BY registre.Numdossier ORDER BY registre.NumDossier";
$query_limit_registrepoints = sprintf("%s LIMIT %d, %d", $query_registrepoints, $startRow_registrepoints, $maxRows_registrepoints);
$registrepoints = mysql_query($query_limit_registrepoints, $ateliermeca) or die(mysql_error());
$row_registrepoints = mysql_fetch_assoc($registrepoints);

if (isset($_GET['totalRows_registrepoints'])) {
  $totalRows_registrepoints = $_GET['totalRows_registrepoints'];
} else {
  $all_registrepoints = mysql_query($query_registrepoints);
  $totalRows_registrepoints = mysql_num_rows($all_registrepoints);
}
$totalPages_registrepoints = ceil($totalRows_registrepoints/$maxRows_registrepoints)-1;
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><!-- InstanceBegin template="../../Templates/registre.dwt.php" codeOutsideHTMLIsLocked="false" -->
<head>
<!-- InstanceBeginEditable name="doctitle" -->
<title>Registre: CONSULTATION</title>
<!-- InstanceEndEditable -->
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<!-- InstanceBeginEditable name="head" -->
<link href="../../Templates/titre_zone.css" rel="stylesheet" type="text/css">
<link href="../../Templates/style_attention.css" rel="stylesheet" type="text/css">
<!-- InstanceEndEditable -->
<script language="JavaScript" type="text/JavaScript">
<!--
function MM_reloadPage(init) {  //reloads the window if Nav4 resized
  if (init==true) with (navigator) {if ((appName=="Netscape")&&(parseInt(appVersion)==4)) {
    document.MM_pgW=innerWidth; document.MM_pgH=innerHeight; onresize=MM_reloadPage; }}
  else if (innerWidth!=document.MM_pgW || innerHeight!=document.MM_pgH) location.reload();
}
MM_reloadPage(true);
//-->
</script>
<link href="style_entete.css" rel="stylesheet" type="text/css">
<style type="text/css">
<!--
body {
	background-image: url(../../Model/bg_grad.jpg);
}
-->
</style>
<link href="menu_gauche.css" rel="stylesheet" type="text/css">
<style type="text/css">
<!--
.Style1 {font-size: 24px}
.texte {
	font-family: Arial, Helvetica, sans-serif;
	color: #FF0000;
}
.Style2 {font-size: 14px}
.Style9 {color: #F2F2F2}
-->
</style>
</head>
<body>
<div id="Layer3" style="position:absolute; left:14px; top:10px; width:170px; height:23px; z-index:2; visibility: visible; font-style: italic; color: #FF0000; font-weight: bold;">
  <div align="center" class="Style1"><a href="../sommaire.php">PONTICELLI</a></div>
</div>
<div id="Navhaut" style="position:absolute; left:11px; top:46px; width:1023px; height:15px; visibility: visible; z-index: 2;"><img src="../../Model/gblnav_left.gif" width="5" height="32"><a href="registregeneral.php"><img src="../../Model/glbnav_background.gif" width="165" height="32" border="0"></a><img src="../../Model/glbnav_background2.gif" width="4" height="32"><a href="../Expertise/expertisegeneral.php"><img src="../../Model/glbnav_background.gif" width="165" height="32" border="0"></a><img src="../../Model/glbnav_background2.gif" width="4" height="32"><a href="../Actions/actionsgeneral.php"><img src="../../Model/glbnav_background.gif" width="165" height="32" border="0"></a><img src="../../Model/glbnav_background2.gif" width="4" height="32"><a href="../FDT/fdtgeneral.php"><img src="../../Model/glbnav_background.gif" width="165" height="32" border="0"></a><img src="../../Model/glbnav_background2.gif" width="4" height="32"><a href="../Modifbasesannexes/mbageneral.php"><img src="../../Model/glbnav_background.gif" width="165" height="32" border="0"></a><img src="../../Model/glbnav_background2.gif" width="4" height="32"><a href="../Statistiques/statistiquegeneral.php"><img src="../../Model/glbnav_background.gif" width="165" height="32" border="0"></a><img src="../../Model/glbnav_right.gif" width="5" height="32"></div>
<div id="GestOT" style="position:absolute; left:21px; top:53px; width:159px; height:21px; z-index:3; visibility: visible;" class="entete">
  <div align="center" class="entete">REGISTRE</div>
</div>
<div id="Layer1" style="position:absolute; left:187px; top:95px; width:841px; height:510px; z-index:4"><!-- InstanceBeginEditable name="zone" -->
<p><span class="titrezone">Dossiers existants dans la Base de DonnEes:</span><br>
    <span class="attention">ATTENTION: seuls les OT dont les points &eacute;t&eacute; remplis dans la section FDT apparaissent</span><br>
</p>

<table border="1">
  <tr>
    <td width="110">NumOT</td>
    <td width="100">NumPompe</td>
    <td width="100">Marques</td>
    <td width="100">Models</td>
    <td width="200">Datedebut</td>
    <td width="100">Cloture</td>
    <td>NumDossier</td>
    <td>SUM(points.Points)</td>
  </tr>
  <?php do { ?>
  <tr>
    <td width="110"><?php echo $row_registrepoints['NumOT']; ?></td>
    <td width="100"><?php echo $row_registrepoints['NumPompe']; ?></td>
    <td width="100"><?php echo $row_registrepoints['Marques']; ?></td>
    <td width="100"><?php echo $row_registrepoints['Models']; ?></td>
    <td width="200"><?php echo $row_registrepoints['Datedebut']; ?></td>
    <td width="100"><?php echo $row_registrepoints['Cloture']; ?></td>
    <td><?php echo $row_registrepoints['NumDossier']; ?></td>
    <td><?php echo $row_registrepoints['SUM(points.Points)']; ?></td>
  </tr>
  <?php } while ($row_registrepoints = mysql_fetch_assoc($registrepoints)); ?>
</table>
</p>
je pense que mon pb vient du fait que la fonction SUM renvoie "NULL" si il n'y a rien a "summer".

comment faire pour obtenir néanmoins tous les dossiers , meme ceux qui n'ont pas de points???

je ne sais pas si c bien clair :=(

en tout cas, merci de votre aide,
FAb