PDA

View Full Version : [VB] La funzione SUM() su SQL Server 2000


race2
31-01-2003, 16:20
Devo fare la somma di un campo della mia Tabella, il Campo "Quantita",

in MySQL esiste la funzione SUM(#nome_campo_da_sommare#), SELECT ID,Nome,Cognome,SUM(Quantita) FROM Contatti

ma in sql server 2000 come si fa ???

Duncan
31-01-2003, 16:43
Esattamente nello stesso modo :)

magari ti consigli di cambiarla così è più chiara... almeno per me ;)

SELECT ID,Nome,Cognome,SUM(Quantita) AS TotaleQuantita FROM Contatti

cionci
31-01-2003, 17:05
Le funzioni di aggregazione quali Sum, Max, Min, Avg sono solitamente standard in tutti i linguaggi SQL...

race2
31-01-2003, 17:12
FUNZIONA!!!


Dim oComm As New SqlCommand("SELECT Consistenza.ID_Articolo,Consistenza.ID_Client,Articoli.ID,Client.ID,Articolo,Quantita FROM Consistenza,Client,Articoli WHERE Consistenza.ID_Articolo = Articoli.ID AND Consistenza.ID_Client = Client.ID AND ID_Client = '" & lwClientResoconto.SelectedItems.Item(0).Text & "'", oConn)




Con "SUM()" NON FUNZIONA!!!


Dim oComm As New SqlCommand("SELECT Consistenza.ID_Articolo,Consistenza.ID_Client,Articoli.ID,Client.ID,Articolo,SUM(Quantita) FROM Consistenza,Client,Articoli WHERE Consistenza.ID_Articolo = Articoli.ID AND Consistenza.ID_Client = Client.ID AND ID_Client = '" & lwClientResoconto.SelectedItems.Item(0).Text & "'", oConn)

Duncan
31-01-2003, 17:16
beh è normale se i campi che hai nella SELECT e su cui non fai SUM() non li includi in una grausola "GROUP BY" se li vuoi raggruppare per ID_Articolo, ID_Cliente ecc...

Altrimenti li ltogli e lasci solo la SUM() ;)

race2
31-01-2003, 17:24
Mi estrae solo il primo Articolo e poi mi da Errore ancora prima di estrarre la prima Quantita...


oConn.Open()
Dim oComm As New SqlCommand("SELECT Consistenza.ID_Articolo,Consistenza.ID_Client,Articoli.ID,Client.ID,Articolo,SUM(Quantita) FROM Consistenza,Client,Articoli WHERE Consistenza.ID_Articolo = Articoli.ID AND Consistenza.ID_Client = Client.ID AND ID_Client = '" & lwClientResoconto.SelectedItems.Item(0).Text & "' GROUP BY Consistenza.ID_Articolo,Consistenza.ID_Client,Articoli.ID,Client.ID,Dim oRead As SqlDataReader = oComm.ExecuteReader
While oRead.Read()
li = lwResocontoTotale.Items.Add(oRead("Articolo"))
li.SubItems.Add(oRead("Quantita"))
End While
oConn.Close()

cionci
31-01-2003, 17:26
Infatti... La Sum deve ritornare un solo record...quindi o metti come solo campo del risultato della query una Sum o devi usare Group By...
Nel secondo caso nella Select puoi selezionare solamente i campi per i quali raggruppi o campi per i quali non raggruppi, ma per cui specifichi una funzione di aggregazione (come ad esempio al Sum)...

Un esempio:

SELECT Nome, Cognome, Count(IDFattura) As NumeroFatture, Sum(Importo) As TotaleImporto
FROM AnagraficaClienti, Fatture
WHERE AnagraficaClienti.IDCliente = Fatture.IDClient
GROUP BY Nome, Cognome

Duncan
31-01-2003, 17:27
hai provato ad eseguire la query nel Query Analyzer?

cionci
31-01-2003, 17:28
Comuqnue VB non è l'ambiente migliore per testare le query...molto meglio testarle con un client testuale almeno si possono fare cambiamenti e test molto più velocemente che in un programma completo...

race2
31-01-2003, 17:37
Originally posted by "Duncan"

hai provato ad eseguire la query nel Query Analyzer?

Come mi puo' aiutare ???

race2
31-01-2003, 17:38
Originally posted by "cionci"

Infatti... La Sum deve ritornare un solo record...quindi o metti come solo campo del risultato della query una Sum o devi usare Group By...
Nel secondo caso nella Select puoi selezionare solamente i campi per i quali raggruppi o campi per i quali non raggruppi, ma per cui specifichi una funzione di aggregazione (come ad esempio al Sum)...

Un esempio:

SELECT Nome, Cognome, Count(IDFattura) As NumeroFatture, Sum(Importo) As TotaleImporto
FROM AnagraficaClienti, Fatture
WHERE AnagraficaClienti.IDCliente = Fatture.IDClient
GROUP BY Nome, Cognome


Scusa ma, "NumeroFatture" e "TotaleImporto" sono due nomi delle tue tabelle ???

cionci
31-01-2003, 18:06
No sono il nome delle collone del risultato della query in cui verranno riportate le varie somme e conteggi...

Ti faccio un esempio...

Tabella Fatture
IDFattura IDCliente Importo
1 1 100
2 1 200
3 2 111
4 2 100
5 1 200

Tabella AnagraficaClienti
IDCliente Nome Cognome
1 Pinco Pallino
2 Tizio Caio

Il risultato della query sarà :

Nome Cognome NumeroFatture TotaleImporto
Pinco Pallino 3 500
Tizio Caio 2 211

Comunque questo sono cose abbastanza base dell'SQL... Ti conviene dare un'occhiata a qualche guida...anche su internet...

race2
31-01-2003, 18:29
Scusami ma ho trovato un altro metodo, e forse piu' facile ma non mi funziona!!!


Dim oComm As New SqlCommand("SELECT Consistenza.ID_Articolo,Consistenza.ID_Client,Articoli.ID,Client.ID,Articolo,(SELECT SUM(Quantita) FROM Consistenza C WHERE C.ID_Articolo = Consistenza.ID_Articolo) FROM Consistenza,Client,Articoli WHERE Consistenza.ID_Articolo = Articoli.ID AND Consistenza.ID_Client = Client.ID AND ID_Client = '" & lwClientResoconto.SelectedItems.Item(0).Text & "'", oConn)

race2
31-01-2003, 18:42
Originally posted by "Duncan"

hai provato ad eseguire la query nel Query Analyzer?

COME SI USA ???

race2
31-01-2003, 18:50
FUNZIONA!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!



Dim oComm As New SqlCommand("SELECT Consistenza.ID_Articolo,Consistenza.ID_Client,Articoli.ID,Client.ID,Articolo,(SELECT SUM(Quantita)FROM Consistenza C WHERE C.ID_Articolo = Consistenza.ID_Articolo)AS Quantita FROM Consistenza,Client,Articoli WHERE Consistenza.ID_Articolo = Articoli.ID AND Consistenza.ID_Client = Client.ID AND ID_Client = '" & lwClientResoconto.SelectedItems.Item(0).Text & "'", oConn)

race2
01-02-2003, 09:55
vorrei chiedere solamente un ultima cosa e poi ho finito questa query......


alla solita Query in questione, dovrei fargli fare pure uno smaltimento degli Articoli identici, cioe':

Di tutti gli "Articoli" con Nome identico che trova nella Tabella "Consistenza", ne deve visualizzare solo uno,

CHIARAMENTE!!! la frase esatta e' : di tutti gli "ID_Articolo" che trovi nella Tabelle "Consistenza", visualizzane solo uno,

MA!!! pur continuando a Sommare TUTTE le Celle "Quantita".........

LE MIE TABELLE:

1)Consistenza = |ID_Articolo|ID_Client|Quantita|
2)Client = |ID|Nome|Cognome|
3)Articoli = |ID|Articolo|

Ci possiamo arrivare ???

cionci
01-02-2003, 10:15
SQL Server dovrebbe supportare anche le subquery nel from:

SELECT DISTINCT * FROM (la tua query)

Attento al formato della query...non so se bisogna usare le tonde o le quadre...oppure se c'è bisogno di rinominare la query per assegnargli un nome...
In Access si fa così (mi sembra):

SELECT DISTINCT * FROM [la tua query]. AS Tabella;

Comunque...ripeto...queste cose sono abbastanza basilari per chi deve lavorare con MS SQL...ti conviene cercare una guida per l'SQL di MS SQL...

race2
01-02-2003, 11:07
Ho provato a fare questo tentativo MA!!!!!!


SELECT DISTINCT ID_Articolo FROM (SELECT Consistenza.ID_Articolo,Consistenza.ID_Client,Articoli.ID,Client.ID,Articolo,(SELECT SUM(Quantita)FROM Consistenza C WHERE C.ID_Articolo = Consistenza.ID_Articolo)AS Quantita FROM Consistenza,Client,Articoli WHERE Consistenza.ID_Articolo = Articoli.ID AND Consistenza.ID_Client = Client.ID AND ID_Client = 1)AS Consistenza


con il Query Analyzer mi da questo errore:

Server: messaggio 8156, livello 16, stato 1, riga 1
La colonna 'ID' è stata specificata più volte per 'Consistenza'.

cionci
01-02-2003, 11:10
Non la puoi richiamare nuovamente Consistenza...dagli un altro nome...
Inoltre devi specificare * dopo distinct altrimenti nel risultato trovi solamente gli ID...

race2
01-02-2003, 11:13
Originally posted by "cionci"

Non la puoi richiamare nuovamente Consistenza...dagli un altro nome...
Inoltre devi specificare * dopo distinct altrimenti nel risultato trovi solamente gli ID...


SELECT DISTINCT * FROM (SELECT Consistenza.ID_Articolo,Consistenza.ID_Client,Articoli.ID,Client.ID,Articolo,(SELECT SUM(Quantita)FROM Consistenza C WHERE C.ID_Articolo = Consistenza.ID_Articolo)AS Quantita FROM Consistenza,Client,Articoli WHERE Consistenza.ID_Articolo = Articoli.ID AND Consistenza.ID_Client = Client.ID AND ID_Client = 1)AS Consistenza2


ERRORE!!!

Server: messaggio 8156, livello 16, stato 1, riga 1
La colonna 'ID' è stata specificata più volte per 'Consistenza2'.

race2
01-02-2003, 12:02
Ecco la Query Finale!!!

Funziona!!!

Ho completato la Query e testata sia nel Query Analyzer che nel SQL Server Enterprise Manager.


Dim oComm As New SqlCommand("SELECT DISTINCT * FROM (SELECT Consistenza.ID_Articolo, Consistenza.ID_Client, Articoli.ID, Client.ID AS Expr1, Articoli.Articolo,(SELECT SUM(Quantita) FROM Consistenza C WHERE C.ID_Articolo = Consistenza.ID_Articolo) AS Quantita FROM Consistenza INNER JOIN Articoli ON Consistenza.ID_Articolo = Articoli.ID INNER JOIN Client ON Consistenza.ID_Client = Client.ID WHERE (Consistenza.ID_Client = '1')) Consistenza")


Grazie mille a tutti !!!!!!!!!!

cionci
01-02-2003, 12:14
Sinceramente non so cosa dirti...aspettiamo qualcuno più esperto di MS SQL... Io non l'ho mai usato...