View Full Version : Sommare determinati campi di una tabella e spostare il risultato in un'altra tabella
Aleiovine86
02-12-2012, 16:02
Ragazzi ho due tabelle:
Clienti: codice,ragione sociale,fatturato tot.....cod_ord(chiave esterna)
Ordini: codice_ordine,codice cliente,data.....totale €
come posso fare per tenere aggiornato automaticamente il fatturato totale ogni volta che inserisco un ordine?
Grazie anticipatamente
bisogna creare una vista, in quel modo interrogando la vista hai il risultato sempre aggiornato
Aleiovine86
02-12-2012, 19:56
Se nn è facile spiegarmi come si fa, hai un link di un manuale?
Avere un attributo derivato (fatturato tot) non è molto "bello".
Hai diverse possibilità, tra cui anche il non avere proprio quel valore totale e di calcolarlo solo quando ti serve, con una query che sommi i singoli fatturati, per esempio:
SELECT codice_cliente, SUM(totale) FROM Ordini GROUP BY codice_cliente
Questa query restituisce una relazione (tabella) con due colonne: la prima è il codice cliente e la seconda la somma dei totali dei singoli ordini del cliente associato.
Puoi anche usare una vista, però non porta molti vantaggi, che poi altro non fa che sottintendere la query che ho scritto sopra. Infatti potresti definire la view "fatturatiTotali":
CREATE VIEW fatturatiTotali AS SELECT codice_cliente, SUM(totale) FROM Ordini GROUP BY codice_cliente
In questo modo hai la stessa identica relazione che hai con la query sopra, solo che puoi accedervi come a un tabella a se stante:
SELECT * FROM fatturatiTotali
è uguale a:
SELECT codice_cliente, SUM(totale) FROM Ordini GROUP BY codice_cliente
Però devi usare una view, che sinceramente non trovo utile in questo caso.
Aleiovine86
02-12-2012, 22:35
Ragazzi siete forti, siete sempre molto utili. Appena torno a casa mi metto subito all'opera
Aleiovine86
03-12-2012, 11:59
Ragazzi ciao, ma come mai quando aggiungo di selezionare la ragione_sociale mi da errore?
SELECT cod_cl, Ragione_sociale, SUM(Totale_€)
FROM Ordini, Clienti
GROUP BY cod_cl;
Sicuro che il nome del campo coincida (maiuscole e minuscole comprese)?
Nota: usare caratteri speciali come $,€,&... è da evitare, inoltre è utile mantenere una certa omogeneità nei nomi, per esempio tutte minuscole.
The_ouroboros
03-12-2012, 13:32
Ragazzi ciao, ma come mai quando aggiungo di selezionare la ragione_sociale mi da errore?
SELECT cod_cl, Ragione_sociale, SUM(Totale_€)
FROM Ordini, Clienti
GROUP BY cod_cl;
una cosa tipo
SELECT a.cod_cl, b.Ragione_sociale, SUM(a.Totale_€)
FROM Ordini a, Client b
GROUP BY a.cod_cl;
o meglio
SELECT cod_cl,
(SELECT Ragione_sociale FROM Client WHERE <cond con un campo della tabella a>) as Ragione_Sociale,
SUM(Totale_€)
FROM Ordini a
GROUP BY cod_cl;
P.S: non so se funzioni sul tuo db
Se la prima funziona, cambia DB.
Se la seconda non funziona, cambia DB.
Aleiovine86
03-12-2012, 13:54
niente..mi da il seguente errore:
La query non include l'espressione 'Ragione_sociale' specificata come parte di una funzione di aggregazione.
Come mai?
The_ouroboros
03-12-2012, 14:03
niente..mi da il seguente errore:
La query non include l'espressione 'Ragione_sociale' specificata come parte di una funzione di aggregazione.
Come mai?
scrivi due info.
Il db usato e la query.
p.s: ma nessuna delle mie 2 ti funziona?
The_ouroboros
03-12-2012, 14:05
Se la prima funziona, cambia DB.
Se la seconda non funziona, cambia DB.
Interessante commento :D
Aleiovine86
03-12-2012, 16:41
utilizzo access 2013 e nessuna delle due funziona...
cmq ho appena comprato filemaker pro advanced 12 sembra fantastico ma bisogna smanettare smanettare smanettare....
The_ouroboros
03-12-2012, 16:53
Le mie sono x oracle.. Con quello lavoro..
Inviato dal mio HUAWEI U8825-1 con Tapatalk 2
Sinceramente quelle due query non mi convincono... la prima a occhio penso ritorni una SUM multipla di quella che serve (selezionando campi di tabelle diverse senza specificare un join, fai un prodotto cartesiano brutale...)
La seconda non mi è chiara, in quanto la query annidata probabilmente ritorna più di una riga, per cui non può stare come argomento del SELECT.
Aleiovine86, per fare quello che devi far te, ti serve un JOIN. Ma prima ti consiglio passionatamente di sistemare il nome degli attributi seguendo le regole che ho citato sopra: niente spazi nei nomi, niente caratteri speciali (€,$,%...), solo minuscole.
Comunque se le tue tabelle sono quelle che hai specificato all'inizio:
Clienti: codice,ragione sociale,fatturato tot.....cod_ord(chiave esterna)
Ordini: codice_ordine,codice cliente,data.....totale €
questo dovrebbe funzionare (almeno su mysql):
SELECT c.codice cliente, c.ragione sociale, SUM(o.totale €)
FROM Ordini AS o LEFT JOIN Clienti AS c
ON o.codice cliente = c.codice cliente
GROUP BY c.codice cliente
The_ouroboros
03-12-2012, 19:33
La seconda non mi è chiara, in quanto la query annidata probabilmente ritorna più di una riga, per cui non può stare come argomento del SELECT.
le uso sempre per lavoro e funzionano molto bene (almeno su Oracle 9.2.0.6) :D
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.