PDA

View Full Version : Che tipo di SQL utilizzare?


Carmen
23-02-2002, 21:42
Ciao a tutti:

Avrei necessità di svolgere la seguente operazione:

In una DBGrid devo visualizzare una lista di record che però molte righe sono sempre uguale, l'unica cosa che cambia e il campo della quantità.

Io vorrei, di tutti i record dupplicati ne dovrei visualizzare uno solo, ma che però mi possa ricavare la somma del campo quantità, relativo ai record dupplicati:

Es. Se io avrei cinque record così strutturati:
1 - Pomodori Qta=1
2 - Pomodori Qta=2
3 - Pomodori Qta=3
4 - Pomodori Qta=4
5 - Pomodori Qta=5

6 - Mele Qta=2

Vorrei poter filtrare questi dati facendo visualizzare una sola volta la voce POMODORI ma però avendo la somma delle quantità in questo caso:

- POMODORI QTA=15
- MELE QTA=2

Spero che qualcuno mi posso veramente aiutare in quanto stò uscendo pazza, non riesco a trovare la sintassi corretta per impostare L'SQL...

Ciao
Carmen!!

Hell-VoyAgeR
23-02-2002, 21:46
select articolo, sum(quantita) as sommaqta [, tutti i campi che ti servono] from tabella group by articolo

questo dovrebbe fare al tuo caso

Carmen
23-02-2002, 22:02
OK! Ci provo e ti faccio sapere. Speriamo che c'è la faccia...

Carmen ;)

Hell-VoyAgeR
23-02-2002, 22:12
...a disposizione...

Carmen
23-02-2002, 22:16
Son fin d'ora di fare una cattiva figura, ma non c'è lo fatta.

Questa la sintassi che o utilizzata:

select Sum(abs(qta)) as sommaqta,Codice,Descrizione from NOMETABELLA group by COSA DEVO SCRIVERE ESATTAMENTE QUI")

Alla voce articolo che mi indicavi tù nell'sql cosa intendevi....


Carmen

Hell-VoyAgeR
23-02-2002, 22:20
direi di mettere group by codice

immagino che sia il campo che ti da' l'univocita'

se vuoi sono anche su irc (canale #rimini cerca di _voyager_) magari facciamo piu' alla svelta

Carmen
23-02-2002, 22:32
Allora la cosa comincia a prendere forma.

Con L'SQL strutturata così:

Data1.RecordSource = ("select descrizione, sum(abs(qta)) as sommaqta,codArticolo from Fatture group by descrizione,codarticolo")

FUNZIONA PERFETTAMENTE.

Siccome però devo visualizzare anche il campo quantita utilizzando la sintassi seguente:

Data1.RecordSource = ("select descrizione,qta sum(abs(qta)) as sommaqta,codArticolo from Fatture group by descrizione,codarticolo,qta")

OPPURE

Data1.RecordSource = ("select descrizione, sum(abs(qta)) as sommaqta,codArticolo,qta from Fatture group by descrizione,codarticolo,qta")

Il risultato sballa ovvero non risulta più corretto ma inferiore a quanto dovrebbe essere.

Hell-VoyAgeR
23-02-2002, 22:37
non ti serve gruppare anche per descrizione, e' sufficiente il codice

quindi solo group by codice

avrei bisogno di sapere perche' vuoi mostrare anche la singola quantita', ci sono notevoli problemi di calcolo in quel modo (in pratica la quantita' che ti viene proposta e' SOLO quella dell'ultima occorrenza dell'articolo)

Carmen
23-02-2002, 22:50
Il fatto è chè se utilizzo questa sintassi

Data1.RecordSource = ("select descrizione, sum(abs(qta)) as sommaqta,codArticolo from Fatture group by descrizione")

Non funziona perche mi dice che (CODARTICOLO) non fa parte dell'agregazione.

Se invece scrivo così:

Data1.RecordSource = ("select descrizione, sum(abs(qta)) as sommaqta,codArticolo from Fatture group by descrizione,CodArticolo")

Funziona!!!

La quantità che si deve visualizzare nella tabella dovrebbe essere la somma di tutti gli articoli avente codice identico.

Es. Se mi trovo 5 articoli con codice 100 e qtà 1,2,3,4,5 Io vorrei visualizzare una sola riga che riporti: (il codice, la descrizione, e la somma delle qtà in questo caso 1+2+3+4+5 =15

quindi sulla DBGRID avrei:

Cod. Articolo Descrizione qtà
100 Mele 15
etc....

Hell-VoyAgeR
23-02-2002, 22:53
prova a fare cosi'

Data1.RecordSource = ("select codArticolo, descrizione, sum(abs(qta)) as sommaqta from Fatture group by codArticolo")

considera che non utilizzo vb ma delphi per programmare, cmq sql e' sempre sql (salvo giochini m$ ;) )

Carmen
23-02-2002, 23:04
Niente da fare non ne vuol sapere. Mi da sempre lo stesso errore: ovvero:

Impossibile eseguire una query che non include l'espressione
"Descrizione" specificata come parte di una funzione di agregazione.


.................Non ne posso pi :mad:

Hell-VoyAgeR
23-02-2002, 23:07
Originariamente inviato da Carmen
[B]Niente da fare non ne vuol sapere. Mi da sempre lo stesso errore: ovvero:

Impossibile eseguire una query che non include l'espressione
"Descrizione" specificata come parte di una funzione di agregazione.


.................Non ne posso pi :mad:

mmm a questo punto bisognerebbe verificare come e' strutturato il database.... non capisco prche' voglia descrizionecome aggregazione...
in ogni caso, provando a mettere SOLO descrizione nella group by ?

ripeto l'invito a raggiungermi su irc se vuoi una consulenza in realtime !

Carmen
23-02-2002, 23:10
schusa da dove ci devo andare per raggiungerti su irc???

Hell-VoyAgeR
23-02-2002, 23:13
beh... se non hai mai chattato in irc e' un po' piu' duretta...
cmq ti ci vuole il programma mIRC www.mirc.com
entrare su un server qualsias... diciamo irc.tin.it o irc.edisontel.it
poi entrare sul canale #rimini (il comando e' /join #rimini)

cmq possiamo anche restare qua o se usi chat diverse dimmi pure

Hell-VoyAgeR
23-02-2002, 23:14
certo che come modo per passare il sabato sera e' perfetto :p :p :p :p

Carmen
23-02-2002, 23:17
un po' complicato, se per tè non ti dispiace per stavolta rimaniamo quì se puoi aiutarmi. Comunque non vorrei alla fine però approfittarne troppo. Se non ti và più fa niente... ti posso capire...

Carmen
23-02-2002, 23:18
Chiamiamolo pure un diversivo ;) ;) ;)

Hell-VoyAgeR
23-02-2002, 23:18
no no dicevo per te !!! io son tornato prima dal ristorante giapponese, la signora l'ho adagiata sul letto ed e' nel mondo dei sogni... e mi piace poter essere utile, speriamo solo di trovare la soluzione

Carmen
23-02-2002, 23:22
Speriamo. Comunque grazie!!!!

Hell-VoyAgeR
23-02-2002, 23:23
hai provato a mettere solo "descrizione" nel group by ?

Carmen
23-02-2002, 23:27
Si prova già fatta. Non FUNGE...

In pratica sembra che quello che si vuole visualizzare di deve indicare sia prima che poi nel Group By.

Il fatto e che se però specifico anche il campo quantità la somma eseguita con SUM non corrisponde più...

Hell-VoyAgeR
23-02-2002, 23:35
eh ci credo... che razza di implementazione sql che hanno messo su...

dunque se usiamo select distinct non ci ritorna la somma

..... .... ...

Hell-VoyAgeR
23-02-2002, 23:37
cazzarola... eppure la sintassi e' quella che ho messo sopra... almeno di standard...

Carmen
23-02-2002, 23:43
Come ai già dimostrato in fatto di SQL ne sai molto più di me.
Quindi ti mando queste due SQL non sò se si possono adattare al caso mio....


Visualizza valori duplicati:

select Nome from tabella
group by Nome having count(Nome) > 1


Visualizza tutti i dati di record dupplicati:

select * from tabella where
nome in (
select Nome from tabella
group by Nome having count(Nome) > 1)

Hell-VoyAgeR
23-02-2002, 23:52
Originariamente inviato da Carmen
[B]Come ai già dimostrato in fatto di SQL ne sai molto più di me.
Quindi ti mando queste due SQL non sò se si possono adattare al caso mio....


Visualizza valori duplicati:

select Nome from tabella
group by Nome having count(Nome) > 1


Visualizza tutti i dati di record dupplicati:

select * from tabella where
nome in (
select Nome from tabella
group by Nome having count(Nome) > 1)

sia la prima che la seconda ci riportano SOLO i records duplicati

forse l'hai gia' provato... ma chissa'

"select *,sum(qta) from fatture group by codice"

Carmen
23-02-2002, 23:56
Niente. Mi dice che è impossibile ragruppare per *

Vacci a capire.... BHOOOOOO!!!!!!!!!!!!


Accidentaccio Accidentaccio!!!!!!!!!!!!!!

Hell-VoyAgeR
24-02-2002, 00:03
grrrr
temo di non avere piu' idee... ho provato la select fatta cosi' su tutti i server sql che ho qui a casa, sia direttamente che con delphi... e funziona

non ho un vb sotto mano (mi permetto di dire "per fortuna") ho paura che dovremo aspettare domani se qualcuno ha qualche idea migliore (magari qualcuno che sviluppa in vb)

Carmen
24-02-2002, 00:06
D'accordo. Comunque grazie dell'aiuto che mi ai dato, visto anche l'ora.

Speriamo che domani possa risolvere lenigma...


FELICE NOTTE!!!


Carmen :rolleyes: :rolleyes: :cool:

Hell-VoyAgeR
24-02-2002, 00:10
che dire... speriamo che la notte porti consiglio !
(e mi scuso anche con gli altri frequentatori del forum se ho trasformato questo 3d in una chat, che non me ne vogliano i moderatori/amministratori)

a domani (mmm oggi)

_V_

Alien
24-02-2002, 00:23
Posso intromettermi?
Secondo me(non ho installato sql a casa, magari poi provo con Access) la sintassi corretta è

Data1.RecordSource = ("select sum(abs(qta)) as sommaqta,codArticolo from Fatture group by CodArticolo")

Dovrebbe restituire la somma e il codice articolo.
Nella group by devono essere presenti tutti i campi specificati nella select esclusi quelli in operazioni aggregate (la sum, appunto)

Se funziona fammi sapere.
ciao

Hell-VoyAgeR
24-02-2002, 00:30
se funziona e' l'unica implementazione sql (che abbia mai visto) che lo richiede !!!!!

come faccio a raggruppare anche ad esempio per descrizione SE voglio visualizzare anche la descrizione nella grid ? (senza nested query intendo)

Ma dopotutto... sappiamo quanto M$ sia generalmente compliant su tutto !!!!

viva lo standard !

Alien
24-02-2002, 00:30
Forse mi sono espresso male, però.
Il codArticolo alla fine sarebbe la descrizione in quanto identifica i vari tipi di frutta da raggruppare.
Per cui se i campi sono organizzati così


CodArticolo Descrizione qta
1 Mele 10
2 Pere 2
3 Mele 5


la query dovrebbe essere:

Data1.RecordSource = ("select sum(abs(qta)) as sommaqta,Descrizionefrom Fatture group by Descrizione")

Hell-VoyAgeR
24-02-2002, 00:34
no no scusa... mi sono espresso malissimo io... data l'ora


se io ho una tabella tipo:

codice | descrizione | quantita | prezzo


e devo semplicemente sommare le quantita' raggruppando per codice ma visualizzando anche descrizione e prezzo, secondo m$ bisognerebbe raggruppare per codice, descrizione e prezzo ??

e se per qualsiasi motivo devo modificare la descrizione mantenendo il codice ?? mi restituirebbe due righe diverse... quindi non otterrei il risultato che carmen desidera.

Alien
24-02-2002, 00:37
Chiedo scusa per la poca precisione ma sono un po' assonnato.

Cmq M$ t-sql sicuramente pretende tutti i campi compresi nella select anche nella group by, esclusi, appunto, quelli già raggruppati da Sum e simili..

Hell-VoyAgeR
24-02-2002, 00:39
figurati... spero che carmen quando si ricolleghera' trovi la segnalazione utile... cmq mi pare che avesse gia' provato qualcosa del genere, ora non ho voglia di ricercare dietro... probabilmente era sbagliato l'ordine dei campi in group by... mah

ti ringrazio dell'intervento

_V_

Alien
24-02-2002, 00:40
Sei troppo rapido x la mia condizione attuale, resto indietro di un post.
il mio precedente non era una risposta al tuo

Hell-VoyAgeR
24-02-2002, 00:43
riguardando indietro ho trovato questo

Data1.RecordSource = ("select descrizione, sum(abs(qta)) as sommaqta,codArticolo from Fatture group by descrizione,CodArticolo")

che direi piu' corretto cos'

Data1.RecordSource = ("select descrizione, sum(abs(qta)) as sommaqta,codArticolo from Fatture group by CodArticolo,descrizione")

alla luce dei fatti cosi' deve funzionare

detto questo mi vado ad adagiare sul materasso pure io!

Alien
24-02-2002, 00:48
così non ci sbagliamo più sul post in questione ;)

Originariamente inviato da Hell-VoyAgeR
[b]

se io ho una tabella tipo:

codice | descrizione | quantita | prezzo


e devo semplicemente sommare le quantita' raggruppando per codice ma visualizzando anche descrizione e prezzo, secondo m$ bisognerebbe raggruppare per codice, descrizione e prezzo ??

e se per qualsiasi motivo devo modificare la descrizione mantenendo il codice ?? mi restituirebbe due righe diverse... quindi non otterrei il risultato che carmen desidera.


1. se hai una tabella

codice | descrizione | quantita |
1................mele.............10
2................pere...............5
3................mele..............11

allora è la descrizione il campo su cui fare la group by (e non vedo l'utilità del codice se non per motivi esterni a questa query)

2. se invece è del tipo

codice | descrizione | quantita |
1................mele.............10
2................pere...............5
1................mele..............11


allora raggruppare per codice e descrizione funziona correttamente.
in questo caso cambiare descrizione e mantenere lo stesso codice non avrebbe senso se non nel caso si volesse identificare un nuovo tipo di "mele" che nulla avrebbe a che vedere con il tipo precedente.

Spero di essere stato più chiaro, nei limiti del possibile anche vista l'ora e il giorno.

Alien
24-02-2002, 00:52
Originariamente inviato da Hell-VoyAgeR
[B]riguardando indietro ho trovato questo

Data1.RecordSource = ("select descrizione, sum(abs(qta)) as sommaqta,codArticolo from Fatture group by descrizione,CodArticolo")

che direi piu' corretto cos'

Data1.RecordSource = ("select descrizione, sum(abs(qta)) as sommaqta,codArticolo from Fatture group by CodArticolo,descrizione")

alla luce dei fatti cosi' deve funzionare

detto questo mi vado ad adagiare sul materasso pure io!

invece secondo me no.
Funzionerebbe solo se la tabella fosse organizzata come nel secondo caso del mio post precedente, invece a me sembra organizzata come nel caso 1), ragion per cui non ha senso raggruppare per CodArticolo.

Quindi dovrebbe essere
Data1.RecordSource = ("select descrizione, sum(abs(qta)) as sommaqta from Fatture group by descrizione")

Chi avrà ragione?
A domani il verdetto! ;)
'notte

Carmen
24-02-2002, 08:16
Buona Domenica Ragazzi.

Vedo che mentre io senza più speranze sono andata a letto voi vi siete dati un bel dafare per cercare di capire lenigma.

Adesso faccio qualche altra prova secondo i vostri consigli e vediamo così se stavolta funziona o meno.........

Comunque avete capito bene il mio problema, ovvero a me interessa ragruppare per descrizione, in modo chè le descrizioni duplicati vengono visualizzati una sola volta ma sommata la loro quantità, ed i risultati visualizzati non vanno modificati, ma solo stampati.



codice | descrizione | quantita |
1................mele.............10
2................pere...............5
3................mele..............11


RISULTATO DA VISUALIZZARE:
1- Mele= 21
2- Pere= 5


Carmen ;)

Alien
24-02-2002, 08:57
Originariamente inviato da Carmen
[B]

RISULTATO DA VISUALIZZARE:
1- Mele= 21
2- Pere= 5

Carmen ;)

Dovrebbe funzionare con il codice scritto sopra, solo il risultato sarà:
Mele 21
Pere 5

non preceduto dal codice, naturalmente.

Carmen
24-02-2002, 09:12
Allora fatta qualche prova sembra che questa sintassi funziona:

Data1.RecordSource = ("select descrizione,CodArticolo, sum(abs(qta)) as sommaqta from Fatture group by descrizione,CodArticolo")


- Problema:

Nella DBGRID dove devono essere visualizzati i dati nell'ordine:

CodArticolo - Descrizione - Quantità

Come faccio a far visualizzare sempre nella DBGRID la somma delle quantità????

Visto che il nome del campo del DB Qtà si deve impostare direttamente nella DBGRID stessa alla proprietà DataField...


AIUTO!!!! AIUTO!!!!! :eek: :confused:

Alien
24-02-2002, 09:16
qui vado un po' alla cieca, visto che non è esattamente il mio campo:

impostare il nome dell'alias?

Carmen
24-02-2002, 09:19
Se per Alias indendi Data1.Recordset("SommaQra"), la quale mi ritorna la somma delle quantità ragruppate, però se voglio visualizzarla nella DBDRIG non mi visualizza niente...

:confused: :confused: :confused: :confused:

Alien
24-02-2002, 09:21
sì intendevo quello.
mmmmmmmm.......

la situazione per me è un po' sconosciuta
lascio il passo ad esperti del settore.
mi spiace.

Carmen
24-02-2002, 09:27
Figurati.. Lo sò che questo sembra essere un caso disperato, e forse senza una soluzione...


Grazie lo stesso dell'aiuto..... Qualche passo lo abbiamo fatto..

Hell-VoyAgeR
24-02-2002, 13:19
dunque, appurato che i risultati ora arrivano corretti....

premessa: ora parlo da perfetto ignorante di vb

non so se nella dbgrid si possano associare dei campi non esistenti a livello di design del database, FORSE a questo punto e' meglio tralasciare la dbgrid ed usare una grid non data-aware e riempire a livello di codice le celle con i risultati ottenuti dalla query...

a questo punto passo la palla sul come possa essere realizzato il codice, mi trovo impreparato, conoscendo altri linguaggi di programmazione.

_V_

cionci
24-02-2002, 17:14
Scusate se mi intrometto...ma mi sembrache anche nello standard SQL '92 nella select seguita da un group by possono apparire soltanto campi per cui si raggruppa o funzioni di aggregazione su campi non raggruppati...

Mi sembra di aver capito che lo schema sia il seguente :

cod descr qta
1....mele...12
2....mele...10
3....pere...20

Se il risultato deve essere :

mele 22
pere 20

Allora perchè raggruppate per codice articolo ? Basta raggruppare soltanto per descrizione...

Quindi :

Select descr, sum(abs(qta)) as SommaQta From Tabella
Group By descr

Se non ho capito bene il problema scusate, ma ho dato na lettura molto veloce...

Carmen
25-02-2002, 00:56
non so se nella dbgrid si possano associare dei campi non esistenti a livello di design del database, FORSE a questo punto e' meglio tralasciare la dbgrid ed usare una grid non data-aware e riempire a livello di codice le celle con i risultati ottenuti dalla query...


Visto che l'SQL adesso funziona l'unica incognita resta far riempire la DBgrid con i risultati della query.

Quindi bisognerebbe provare grid non data-aware in modo da far riempire i campi direttamente da codice....


Carmen :confused:

Hell-VoyAgeR
25-02-2002, 09:12
ehm.... era un modo come un altro per dire.... "bisogna forse trovare altre strade"

:confused: