Somma righe in corrispondenza

  • Creatore Discussione Creatore Discussione pup3770
  • Data di inizio Data di inizio

pup3770

Utente Attivo
30 Mag 2012
122
0
16
Ciao Ragazzi,
so benissimo che è molto tardi infatti, sfinito, sto per andare a letto. Sono stato fino ad ora a provare a trovare la soluzione per non disturbarvi ma nulla.

Il problema è il seguente:
Ho due tabelle:
Codice:
dipendenti(id_dipendente, nome, cognome, sesso, telefono, mansione)
ordini(id_ordine, id_dipendente, tipo_articoli, quantita)


Adesso desidero prima capire in sql e poi implementare in php come mostrare una schermata in cui viene visualizzato il totale dato dalla somma delle quantita degli ordini fatto da un dipendente e il suo rispettivo nome e cognome.

In SQL ho scritto la query:
Codice:
SELECT o.id_dipendente, d.nome, d.cognome, SUM( quantita ) 
FROM ordini o, dipendenti d
WHERE o.id_dipendente = d.id_dipendente
GROUP BY o.id_dipendente

e funziona correttamente.

Adesso devo creare lo script in php.
Ho, mediante phpmyadmin di MAMP generato il codice PHP per questione di tempo e mi ritrovo il codice seguente:
PHP:
<html>
<head>
<title> Visualizzazione l'aggregazione secondo tipo_articoli </title>
</head>
<body>

<font color="#FF0000" size = 5> Pagina in cui viene visualizzata l'aggregazione secondo tipo_articoli </font>
	

<?php
	
	$connessione = mysql_connect("localhost","root","root") or die ("ATTENZIONE: Errore di connessione al database\n");
	
	$selezione_db = mysql_select_db("ProgDataWarehouse", $connessione) or die ("ATTENZIONE: Errore nella selezione del database\n");


	$query = "SELECT o.id_dipendente, d.nome, d.cognome, SUM('quantita') \n"
    . "FROM ordini o, dipendenti d\n"
    . "WHERE o.id_dipendente = d.id_dipendente\n"
    . "GROUP BY d.id_dipendente LIMIT 0, 30 ";

$result = mysql_query($query);


while ($row = mysql_fetch_assoc($result)) { 
                
                echo "ID dipendente: <strong>{$row['id_dipendente']}</strong><br>"; 
                
                
                $subSql   = "SELECT * FROM dipendenti WHERE id_dipendente = {$row['id_dipendente']}"; 
                $subQuery = mysql_query($subSql, $connessione); 
                $subRow   = mysql_fetch_assoc($subQuery); 
                 
                echo "Nome dipendente: <strong>{$subRow['nome']}</strong><br>"; 
                echo "Cognome dipendente: <strong>{$subRow['cognome']}</strong><br>";                
                
                
                echo "Quantita': <strong>{$row['quantita']}</strong><br>"; 
                 
                   
                echo "<br><br>===========================<br><br>"; 
            } 

?>
</body>
</html>

Funziona tutto, mi aggrega correttamente, mi prende l'id_dipendente corretto, il nome e il cognome corretto dei dipendenti, il problema è che la quantita non me la visualizza.
Come mai non riesco a visualizzarla? Immagino ci sia qualche problema nell'introduzione dei valori da sommare nel ciclo while. Come poter risolvere il problema?
 
Intanto grazie per la partecipazione, comunque continua a non mostrare il contenuto. Stanotte mi è venuto un flash, ma visto che sono in un ciclo, non mi conviene fargli memorizzare la quantità ad ogni iterazione quando trova d.id_dipendente == o.id_dipendente.
Però continua ad esserci qualcosa che non mi quadra nell'implementazione.
 
Risolto.


Seguendo l'esempio al link precedente e seguendo anche il consiglio di
adesso funziona, come ho fatto:
Ho sostituito la stringa:
PHP:
echo "Quantita': <strong>{$row['quantita']}</strong><br>";

con la stringa:
PHP:
echo "Quantita': <strong>{$row['SUM(quantita)']}</strong><br>";

il consiglio di
è corretto perché mettendo sia in:
PHP:
$query = "SELECT o.id_dipendente, d.nome, d.cognome, SUM(quantita) \n"
    . "FROM ordini o, dipendenti d\n"
    . "WHERE o.id_dipendente = d.id_dipendente\n"
    . "GROUP BY d.id_dipendente LIMIT 0, 30 ";

al posto di:
Codice:
SUM(quantita)
metto
Codice:
SUM(o.quantita)
e nel ciclo while bisogna scrivere:
Codice:
echo "Quantita': <strong>{$row['SUM(o.quantita)']}</strong><br>";

Ragazzi grazie mille per i vostri consigli e per questo bel forum che posso dire funziona bene; lo dico io che sono sempre stato contrario ai forum invece fino ad oggi qui mi sono trovato bene e incentivato a ragionare e provare.

Grazie di tutto
 
ciao
al sum dagli as, poi, secondo me, devi raggruppare secondo gli id_dipendente che hai negli ordini, nella tabella dipendenti l'id_dipendente è (dovrebbe essere) unico quindi assurdo dargli il group by
PHP:
<?php
//..........
 $query = "SELECT o.id_dipendente, d.nome, d.cognome, SUM(o.quantita) as totale
    FROM ordini o, dipendenti d 
    WHERE o.id_dipendente = d.id_dipendente 
    GROUP BY o.id_dipendente LIMIT 0, 30 ";
//......
?>

poi googlando ho trovato qualcosa (ma non sono sicuro)
nel while prova a mettere (comunque prima prova cosi come l'hai fatto)
PHP:
echo "Quantita': <strong>{$row['SUM(o.quantita)']}</strong><br>";
oppure
PHP:
echo "Quantita': <strong>{$row['totale']}</strong><br>";

prova, al massimo siamo punto e a capo
 
grazie
, la modifica di
e di
PHP:
echo "Quantita': <strong>{$row['totale']}</strong><br>";
funziona benissimo ed anzi è meglio per questione di leggibilità.
Per quanto riguarda:
poi, secondo me, devi raggruppare secondo gli id_dipendente che hai negli ordini, nella tabella dipendenti l'id_dipendente è (dovrebbe essere) unico quindi assurdo dargli il group by
non riesco a seguirti; che id_dipendente della tabella dipendenti è unico si, è sia chiave e sia generato automaticamente grazie alla funzione
Codice:
AI
(auto increment), in merito al non utilizzo di
Codice:
GROUP BY
non riesco a seguirti.
 
Cioè seguendo quanto scritto sui testi e sugli esempi, vedi link:
HTML:
http://www.liceofoscarini.it/didattic/data-base/sql/groupby.html

il GROUP BY io lo utilizzo per raggruppare secondo
Codice:
o.id_dipendente
perché realmente io voglio che ogni id_dipendente sia univoco anche in questa visualizzazione e venga sommato il valore della quantita ogni qual volta viene visto dal ciclo che l'id_dipendente esiste ed è uguale ai precedenti.

Non vorrei sbagliarmi, come dicevo non sono molto ferrato, però credo che altra soluzione non ce ne sia
 
ciao
per il gruop by era una mia impressione, ma probabilmente è lo stesso.
tu fai
GROUP BY d.id_dipendente
cioe raggruppi secondo gli id presenti nella tabella dipendenti, ma in quella tabella l'id dovrebbe essere unico
mentre nella tabella ordini un dipendente può fare più ordini quindi il suo id può comparire più volte nella tabella ordini, per quello dicevo di fare

GROUP BY o.id_dipendente
 
certo scusa hai ragionissima, non avevo capito cosa volevi dire perché nel listato che ho messo nella discussione avevo messo d.id_dipendente mentre quando tu mi rispondevi io guardavo lo script che modificavo e testavo e questa modifica già l'avevo apportata, infatti non capivo dove dicevi tu. Cmq certo essendo che id_dipendente è chiave della tabella dipendenti, a me conviene raggruppare per id_dipendente di ordine.
Adesso funziona tutto e correttamente.

Grazie ancora
 
Scusate l'orario ma ero a mangiare fuori per festeggiare il mio 25 esimo compleanno ;-)
Il codice funzionante è:

PHP:
<html>
<head>
<title> Visualizzazione l'aggregazione secondo id_dipendente </title>
</head>
<body>

<font color="#FF0000" size = 5> Pagina in cui viene visualizzata l'aggregazione secondo id_dipendente </font>
	

<?php
	
	$connessione = mysql_connect("localhost","root","root") or die ("ATTENZIONE: Errore di connessione al database\n");
	
	$selezione_db = mysql_select_db("ProgDataWarehouse", $connessione) or die ("ATTENZIONE: Errore nella selezione del database\n");


	$query = "SELECT o.id_dipendente, d.nome, d.cognome, SUM(quantita) as totale \n"
    . "FROM ordini o, dipendenti d\n"
    . "WHERE o.id_dipendente = d.id_dipendente\n"
    . "GROUP BY o.id_dipendente LIMIT 0, 30 ";
    	
	$result = mysql_query($query);

	$numrows = mysql_num_rows($result); 
         
        echo "<big>Sono stati letti <span style=\"color:red\">{$numrows}</span> ordini per dipendente</big>"; 
        echo "<h2><big> Dati tabella Ordini aggregati per dipendente </big></h2>"; 


while ($row = mysql_fetch_assoc($result)) { 
                
                echo "ID dipendente: <strong>{$row['id_dipendente']}</strong><br>"; 
                
                
                $subSql   = "SELECT * FROM dipendenti WHERE id_dipendente = {$row['id_dipendente']}"; 
                $subQuery = mysql_query($subSql, $connessione); 
                $subRow   = mysql_fetch_assoc($subQuery); 
                 
                echo "Nome dipendente: <strong>{$subRow['nome']}</strong><br>"; 
                echo "Cognome dipendente: <strong>{$subRow['cognome']}</strong><br>";                
                
                echo "Quantita': <strong>{$row['totale']}</strong><br>"; 
                 
                 
                 
                echo "<br><br>===========================<br><br>"; 
            } 

?>
</body>
</html>

Spero possa esservi d'aiuto. Se riscontrate problemi o migliorie accetto volentieri.
 

Discussioni simili