PDA

Visualizza la versione completa : [SQL] Problema query


Danelius
27-11-2008, 02:08
Ho il seguente schema:

Prodotto(id_prod, nome, descrizione, prezzo)
Scontrino(id_scontr, data, totale)
Dettaglio(id_scontr, id_prod, quantita)

Trovare i prodotti che non sono apparsi nello stesso scontrino....

Io ho provato prima così:



SELECT *
FROM ( SELECT Dettaglio.id_scontr AS S1, Prodotto.id_prod AS P1
FROM Dettaglio JOIN Prodotto ) AS tab1
WHERE tab1.P1 NOT IN ( SELECT Dettaglio.id_prod
FROM Dettaglio )
AND tab1.S1 IN ( SELECT Dettaglio.id_scontr
FROM Dettaglio )


e poi così:


( SELECT Dettaglio.id_scontr AS S1, Prodotto.id_prod AS P1
FROM Dettaglio JOIN Prodotto
GROUP BY Dettaglio.id_scontr, Prodotto.id_prod)
INTERSECT
( SELECT Dettaglio.id_scontr AS S2, Dettaglio.id_prod AS P2
FROM Dettaglio )


la seconda è formata dalla prima tab che include tutte le occorrenze possibili (tra gli scontrini e i prodotti) intersecata alla seconda che include i prodotti che compaiono in ogni scontrino....ma nemmeno questo funziona... :dhò:

123delphi321
27-11-2008, 09:16
Ciao



select dettaglio.id_scontr,prodotto.id_prod,prodotto.nome
from dettaglio
left join prodotto on id_prod=dettaglio.id_prod
where dettaglio.id_scontr=:NumeroScontrino


il comando GROUP va usato in congiunzione con una funzione statistica come ad esempio SUM...

nella struttura delle tue tabelle ho visto che la tabella 'dettaglio' non ha un campo ID: a me hanno insegnato che ogni tabella deve avere un campo id univoco che contraddistingue ogni suo record, questo per un ordine logico ed anche per ottimizzare le prestazioni....

ciao

Danelius
27-11-2008, 12:30
il comando GROUP va usato in congiunzione con una funzione statistica come ad esempio SUM...
mmm....forse


la tabella 'dettaglio' non ha un campo ID id_scontr, id_prod sono le chiavi


where dettaglio.id_scontr=:NumeroScontrino NumeroScontrino non esiste! :master:

e poi come mi hai indicato tu non funziona nemmeno.. :dhò:
Altra soluzione?

Stoicenko
27-11-2008, 12:59
Citazione:
il comando GROUP va usato in congiunzione con una funzione statistica come ad esempio SUM...

mmm....forse



senza forse.. è così..

Per ottenere ciò che vuoi dovresti trovare tutti i prodotti e sottrarre (not in) tutti i prodotti di un dato scontrino, questo per ogni scontrino..

La cosa la vedrei meglio con una funzione.. ora penso ad una possibile query

Stoicenko
27-11-2008, 13:08
provo:




prodotto = P
dettaglio = D
scontrino = S

SELECT P.descr, S.id
FROM P, S
WHERE P.id not in (
SELECT P.id
FROM P right join D left join S)




questa però ti da i prodotti che non stanno in nessuno scontrino..

non mi viene in mente come applicarla scorrendo gli scontrini..

Danelius
27-11-2008, 13:58
niente da fare ...non funziona :(

123delphi321
27-11-2008, 14:47
ciao,

non ho ben capito cosa vuoi come risultato!

Per ogni scontrino emesso, vuoi la lista degli articoli non presenti nello scontrino?



select
Prodotto.id_prod,
Prodotto.nome,
from prodotto
where prodotto.id_prod not in
(select dettaglio.id_prod from dettaglio where dettaglio.id_scontr=:MioScontrino)


nb.:MioScontrino e' un parametro esterno

ciao

Stoicenko
27-11-2008, 15:21
come giustamente detto da delphi321 la query che ti abbiamo scritto io e lui deve essere usata per ogni scontrino.. quindi devi parametrizzarla o farne una funzione che venga usata per ogni id_scontrino..

Danelius
27-11-2008, 16:42
ragazzi, scusate...forse non mi sono espresso male...
graficamente, dovrei crearmi una tab che contiene tutte le combinazioni possibili tra gli scontrini e i prodotti



/* Tab1 */
id_scontr | id_prod

S1 | P1
S1 | P2
S1 | P3
S2 | P1
S2 | P2
S2 | P3
S3 | P1
S3 | P2
S3 | P3


e sottrarla alla tab 'dettaglio', ad es:



/*Dettaglio*/

id_scontr | id_prod

S1 | P1
S1 | P3
S2 | P2
S3 | P2
S3 | P3


e dare così il risultato:



id_scontr | id_prod

S1 | P2
S2 | P1
S2 | P3
S3 | P1


la differenza insomma, e no l'intersezione (come precedentemente ho errato)...quindi io pensavo una cosa del genere:



( SELECT Dettaglio.id_scontr, Prodotto.id_prod
FROM Dettaglio JOIN Prodotto ) /* Cioè la Tab1 */
EXCEPT
( SELECT Dettaglio.id_scontr, Dettaglio.id_prod
FROM Dettaglio ) /* cioè la Tab 'Dettaglio' */


Scusate se vi ho fatto incasinare... :(

123delphi321
27-11-2008, 18:55
Ciao Danelius,

scusami ma oggi per me e' una giornataccia.... proprio non riesco a capire quale sia il tuo obiettivo....

per cortesia potresti re-illustrarlo....

grazie

Loading