Query SQL per Media di tutti i record si una selezione

mercoledì 31 luglio 2013 - 17.01
Tag Elenco Tags  VB.NET  |  .NET 4.0  |  Windows XP  |  Visual Studio Express  |  MySQL 5.1  |  Access (.mdb)  |  Firefox  |  Javascript  |  CSS 2.1  |  CSS 3.0

ravalon Profilo | Expert

Salve a tutta la community,

avrei bisogno di sapere se esiste un modo (dato che non ci riesco) per estrarre una serie di dati relativi a quantitativi e calcolarne la media globale....ossia la media tenendo conto delle quantità di TUTTI i records...

Sono partito da una query di questo genere:

SELECT NomeProdotto,DataOrdine,QtOrdinata,avg(qtOrdinata) as Media FROM OrdiniGenerati WHERE CodSettore='MICROB' AND CodProdotto='33630' AND DataOrdine >= #1/1/2010# AND DataOrdine <= #7/31/2013# GROUP BY NomeProdotto,DataOrdine,QtOrdinata ORDER BY DataOrdine ASC

La media, oltre che tramite l'uso della funzione AVG, potrei calcolarla separatamente cosi:

SELECT Sum(qtOrdinata)/count(QtOrdinata) as Media FROM OrdiniGenerati WHERE CodSettore='MICROB' AND CodProdotto='33630' AND DataOrdine >= #1/1/2010# AND DataOrdine <= #7/31/2013#

..e non vi sarebbero problemi...Ma ho bisogno di calcolarla nella query iniziale, insieme agli altri dati e li casca l'asino...non ci riesco...
Ho bigosno di calcolare tutto insieme perchè devo fare il binding della sorgente dati con un controllo MsChart, per cui se non ho tutto nella stessa estrazione non mi riesce...

Come posso fare ?

AntCiar Profilo | Expert

ciao.

alla fine puoi usare la seconda nella prima senza raggruppare per la quantità

SELECT NomeProdotto,DataOrdine, SUM(QtOrdinata) / COUNT(qtOrdinata) as Media
FROM OrdiniGenerati
WHERE CodSettore='MICROB'
AND CodProdotto='33630'
AND DataOrdine >= #1/1/2010#
AND DataOrdine <= #7/31/2013#
GROUP BY NomeProdotto,DataOrdine
ORDER BY DataOrdine ASC
Cristian Barca

ravalon Profilo | Expert

Ciao e grazie per la risposta...

...già provato, ma in quel modo fa la media dei records estratti fino a quel momento, non di tutti...

cioè, al secondo record mi fa la media dei primi due records, al terzo dei primi tre etc etc...

ridaria Profilo | Expert

scusa ma la prima query non ti restituisce la media della qtaOrdinata nel periodo indicato???

Cosa ti restituisce allora?

CIao
Riccardo D'Aria

ravalon Profilo | Expert

La media corretta funziona solo se la lanci da sola, se la metti insieme ad altro con group by eccetera non restituisce la media....ho infatti indicato due query diverse per far capire che so come si ottiene ma insieme alla seconda (che estrae i dati che mi servono) non funziona...

ridaria Profilo | Expert

non ti seguo, così come la hai scritta, ti restituisce la media ed i campi presenti nella clausola group by.

Ti servono altri campi?
Riccardo D'Aria

ravalon Profilo | Expert

Provo a spiegarmi meglio...

Se uso

SELECT Sum(qtOrdinata)/count(QtOrdinata) as Media FROM OrdiniGenerati WHERE CodSettore='MICROB' AND CodProdotto='33630' AND DataOrdine >= #1/1/2010# AND DataOrdine <= #7/31/2013#

Questo per dire ...so come usare la funzione AVG oppure una equivalente "Sum(qtOrdinata)/count(QtOrdinata) as Media"

Però a me serve ottenere, in un'unica query, sia la media GLOBALE DI TUTTI I RECORDS ESTRATTI, sia altri dati....

Se alla quey di cui sopra aggiungo i campi che mi necessitano, ecco che la media globale non mi viene più fuori, ma diventa la media calcolata per ogni record e non quella globale...

Se infatti uso questa

SELECT NomeProdotto,DataOrdine,QtOrdinata,avg(qtOrdinata) as Media FROM OrdiniGenerati WHERE CodSettore='MICROB' AND CodProdotto='33630' AND DataOrdine >= #1/1/2010# AND DataOrdine <= #7/31/2013# GROUP BY NomeProdotto,DataOrdine,QtOrdinata ORDER BY DataOrdine ASC

Non so se è per il group by o cosa...ormai sono andato in confusione e non troverei la soluzione nemmeno se l'avessi di fronte...

Spero di essermi spiegato, ma voglio essere ancora più preciso....

Il risultato della query è questo...

NomeProdotto DataOrdine QtOrdinata Media AGAR BCSA 2010/01/18 00.00.00 10 10 AGAR BCSA 2010/09/17 00.00.00 2 2 AGAR BCSA 2010/09/17 00.00.00 100 100 AGAR BCSA 2010/12/06 00.00.00 1 1 AGAR BCSA 2011/04/17 00.00.00 2 2 AGAR BCSA 2011/10/19 00.00.00 4 4 AGAR BCSA 2012/09/18 00.00.00 2 2 AGAR BCSA 2012/09/18 00.00.00 7 7

Come vedete, la Media mi corrisponde alla QtOrdinata... invece dovrebbe darmi il valore "16" nell'esempio che proviene da Sum(QtOrdinata) / count(QtOrdinata) ossia 128/8

ridaria Profilo | Expert



Non riesco a capire cosa ti serve.

LA media di tute le quantità in un determinato periodo di tempo?




Riccardo D'Aria

AntCiar Profilo | Expert

Devi lasciare solo

GROUP BY NomeProdotto

per gli altri dati tipo la DataOrdine devi prendere la minima o la massima del gruppo.


NomeProdotto DataOrdine QtOrdinata Media
AGAR BCSA 2010/01/18 00.00.00 128 16 (128/8)




Se lasci

GROUP BY NomeProdotto, DataOrdine

ti fa la media oltre che per articolo anche per dataOrdine. Nel tuo caso dovresti avere questo:
(in totale dovresti avere 6 record perchè sono solo due i record che hanno data uguale e quindi viene calcolata la media)


NomeProdotto DataOrdine QtOrdinata Media
AGAR BCSA 2010/01/18 00.00.00 10 10
AGAR BCSA 2010/09/17 00.00.00 102 51 (102/2)
AGAR BCSA 2010/12/06 00.00.00 1 1
AGAR BCSA 2011/04/17 00.00.00 2 2
AGAR BCSA 2011/10/19 00.00.00 4 4
AGAR BCSA 2012/09/18 00.00.00 9 4.5 (9/2)
Cristian Barca

ravalon Profilo | Expert

Essendoci un AVG(QtOrdinata) devo per forza mettere QtOrdinata anche nel group by sennò ottengo questo errore...

ErrorMessage: Impossibile eseguire una query che non include l'espressione "DataOrdine" specificata come parte di una funzione di aggregazione.

Se non metto la AVG(QtOrdinata) non so come ottenere il conteggio e comunque se faccio una select con una query di aggregazione, il campo usato lo devo mettere nel group by

ridaria Profilo | Expert

a prescindere adesso dalla query,

Non riesco a capire cosa ti serve.

LA media di tute le quantità in un determinato periodo di tempo?

Se riesco a capire cosa vuoi estrarre, prescindendo adesso dal come, probabilmente riesco a darti una mano.

CIAO
Riccardo D'Aria

ravalon Profilo | Expert

Mi serve la media del campo QtOrdinata (ossia dei quantitativi) calcolata su tutti i records estratti e mi servirebbe averla come campo nei risultati...

cioè, se mi vengono estratti 10 record vorrei la media globale sui 10 record invece per ora mi fa la media per ogni record, tenendo quindi conto di un solo record (per cui la media è inutile)

ridaria Profilo | Expert

Allora il valore media AVG viene restituito da solo, nel senso che ottiani come risultato della query solo il campo Media come da sql che segue.
select avg(totaleFattura2) as media from fattureemesse where DataDocumento >'01/01/2013' and DataDocumento <'31/12/2013'
questa query mi estrae solo un campo il campo Media che contiene il valore medio delle fatture comprese tra le due date.

Se vuoi altri campi, questi vanno idicati nella select: Select id, nome, avg(totaleFattura2) as media from fattureemesse ,....
groub by id, nome etc.

Ma attenzione essendo la funzione AVG per sua natura una funzione di aggregazione perche la media non è altro che un indicatore unico di una serie di valori, allora se vuoi estrarre anche alri campi, puoi estrarre solo quelli che possono essere raggruppati e su questi eseguire la media.

Mi spiego, la medi adelle vendite da data a data è una media, un singolo valore, come associ a questo valore codice articolo, se la media e composta dalle vendite di più di un articolo?


In parole povere se lavori con la funzione AVG, puoi ottenere come campi aggiuntivi nel risultato solo quelli per cui è possibile fare un group by.
E nel caso di un group by poi la media è riferita a tutti i records raggruppabili. Ex per codice articolo
otterrai tanti valori medi quanti sono i codici articolo differenti esistenti nella tabella. se vi sono 300 record di vendita per soli tre articoli, otterrai 3 record con la media, uno per ogni codice.

Spero di essere stato chiaro

CIAo











Riccardo D'Aria

ravalon Profilo | Expert

Ti ringrazio per il tuo tempo ma è quello che avevo già scritto...

Io estraggo un solo tipo di articolo come puoi vedere dai risultati che ho incollato... ed ho anche provato ad estrarre la media facendo un calcolo a mano (senza funzione AVG) come puoi vedere sempre dalle query che ho incollato...

ridaria Profilo | Expert

prego, e quindi se lo hai già scritto allora lo sai cosa puoi e non puoi fare.

Ciao
Riccardo D'Aria

ravalon Profilo | Expert

Pur ringraziandoti enormemente per avermi dedicato il tuo tempo, credo che tu non abbia mai letto con attenzione quello che chiedevo altrimenti non mi facevi certe domande e non concludevi dicendo "allora lo sai cosa puoi e non puoi fare"...

Ho esordito dicendo che so come si fa un'estrazione di una media con la funzione AVG secca ma che avevo bisogno di estrarre altri dati insieme, per forza nella stessa query...chiedevo se esisteva un modo a me sconosciuto... o per bypassare il mio problema....se non c'è ok, basta dirlo.

ridaria Profilo | Expert

>Pur ringraziandoti enormemente per avermi dedicato il tuo tempo,
>credo che tu non abbia mai letto con attenzione quello che chiedevo
>altrimenti non mi facevi certe domande e non concludevi dicendo
>"allora lo sai cosa puoi e non puoi fare"...
>
>Ho esordito dicendo che so come si fa un'estrazione di una media
>con la funzione AVG secca ma che avevo bisogno di estrarre altri
>dati insieme, per forza nella stessa query...chiedevo se esisteva
>un modo a me sconosciuto... o per bypassare il mio problema....se
>non c'è ok, basta dirlo.

Sarebbe stato dirimente per te, dirti non si può fare. Ti ho spiegato la logica che sta alla base delle estrazioni aggregate ed in base alla quale puoi estrarre solo i dati che sono a loro volta aggregabili.

Ciao
e chiudi il post.



Riccardo D'Aria
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5