Pagina 1 di 1

[SQL] errore all'esecuzione della query

MessaggioInviato: lun nov 13, 2006 7:41 pm
da GraziaR.
Nel momento in cui eseguo una query con la funzione DISTINCT mi visualizza l'errore 3085 che dice che la funzione non è definita nell'espressione. In Access l'ho scritta in questo modo:
SELECT SUM(DISTINCT(Com_Costo))
From Componenti;
in modo tale che quando gira vengano tutti i costi diversi dei componenti sommati tra di loro. Praticamente DISTINCT elimina i costi duplicati cioè doppi, mentre SUM somma i costi diversi. qual è l'errore nel codice SQL che ho appena scritto?

MessaggioInviato: lun nov 13, 2006 7:59 pm
da Ices_Eyes
E cosa centra con sicurezza??? [sbigot]

Comunque sia DISTINCT è una parola chiave di SQL, e non una funzione, per cui scritta così non ha alcun senso.... La query che ti serve non so se possa essere scritta così:
Codice: Seleziona tutto
SELECT DISTINCT SUM(Com_Costo) FROM Componenti


Ma forse più corretta è:
Codice: Seleziona tutto
SELECT SUM(costo) FROM (SELECT DISTINCT Com_Costo FROM Componenti) AS t

codice esatto sql query

MessaggioInviato: mar nov 14, 2006 3:34 pm
da GraziaR.
Entrambe le soluzioni non funzionano, soprattutto la seconda perché dopo from vanno solo i nomi dele tabelle. Select deve visualizzare la somma dei costi diversi dei componenti quando gira. Se, per esempio, ci sono due costi 50000, nella somma ne viene conteggiato solo uno e quest'ultimo viene sommato agli altri purchè questi non siano duplicati. Quindi distinct visualizza i costi unici eliminando i valori doppi, mentre sum fa la somma dei costi unici, cioè diversi tra loro senza che si ripetino nella somma. La query che ho suggerito prima è esatta perché nella traccia del compito c'è la soluzione. Il problema è che non gira e quindi alla sua esecuzione mi dà l'errore 3085. Vorrei sapere se è necessario definire la funzione distinct. Se è così come? E, inoltre, come risolvere l'errore 3085? La query della traccia è la seguente: chiede di sommare i costi diversi di tutti i componenti. Il campo da utilizzare è Com_Costo. Applicare a Com_Costo prima distinct e poi sum. Quindi distinct va tra parentesi dopo sum.
La soluzione è la seguente:
SELECT SUM(DISTINCT Com_Costo)
FROM Componenti.
SUM E DISTINCT SONO OPERATORI AGGREGATI. Componenti è la tabella.

MessaggioInviato: mer nov 15, 2006 11:30 am
da Robby78
propongo un:

Codice: Seleziona tutto
Select sum(Com_Costo) FROM Componenti Where Com_Costo in (SELECT DISTINCT Com_Costo FROM Componenti)

MessaggioInviato: mer nov 15, 2006 11:40 am
da Ices_Eyes
Le query funzionano tutte, anche quella con SUM(Distinct...) provate su postgres...Nella clausola FROM puoi metterla una select, senza grossi problemi, basta specificarne un alias (è così che funzionano le viste).

Il motivo per cui ti da errore sinceramnete non lo saprei...potrebbe essere che o la SELECT SUM(DISTINCT...) non è standard di SQL, ma comunque permessa da Postgres, e quindi non va in ACCESS, oppure, più semplicemente, ACCESS non la implementa...non sarebba la prima cosa... [;)]

query sql

MessaggioInviato: mer nov 15, 2006 10:34 pm
da GraziaR.
Ices_Eyes ha scritto:Le query funzionano tutte, anche quella con SUM(Distinct...) provate su postgres...Nella clausola FROM puoi metterla una select, senza grossi problemi, basta specificarne un alias (è così che funzionano le viste).

Il motivo per cui ti da errore sinceramnete non lo saprei...potrebbe essere che o la SELECT SUM(DISTINCT...) non è standard di SQL, ma comunque permessa da Postgres, e quindi non va in ACCESS, oppure, più semplicemente, ACCESS non la implementa...non sarebba la prima cosa... [;)]


Avevi ragione perché la seconda istruzione che definisci più corretta gira in Access senza creare errori. E' vero che mettendo la ridenominazione al select dopo from funziona la query. Purtroppo non avevo mai visto un esempio di questa query, perciò non potevo essere sicura dell'attendibilità del tuo suggerimento. Però l'esercizio può essere anche risolto facendo una query di creazione tabella col distinct e poi un'altra query col sum. Però con la tua soluzione creo una sola query. Quale dei due risultati mi consigli?