Basi di dati: query

mathfinder
Ciao a tutti,

supponete di avere la seguente tabella:
ordineFornitore(data, fornitore, prodotto, quantita, costoUnitario, ricevuto)

fornitore contiene la partiva iva e ricevuto è una variabile booleana che indica con true se la merce è stata consegnata o meno.
Si definisce affidabilità di un fornitore il rapporto tra numero di ordini in stato TRUE rispetto a quelli in stato FALSE

domanda: estrarre il fornitore più affidabile.

:snakeman:

Risposte
hamming_burst
Ciao,
"mathfinder":
Ciao a tutti,

supponete di avere la seguente tabella:
ordineFornitore(data, fornitore, prodotto, quantita, costoUnitario, ricevuto)

fornitore contiene la partiva iva e ricevuto è una variabile booleana che indica con true se la merce è stata consegnata o meno.
Si definisce affidabilità di un fornitore il rapporto tra numero di ordini in stato TRUE rispetto a quelli in stato FALSE

domanda: estrarre il fornitore più affidabile.

:snakeman:


hai provato a risolverla? se sì cosa non ti torna o non riesci. Proponi qua la tua soluzione e vediamo cosa non funziona.

mathfinder
Grazie per la risposta,

diciamo che ho provato a risolverla ma la soluzione è sbagliata,
cioè io non so calcolare l'affidabilità.

L'idea era quella di creare due viste V1 e V2,
V1 contiene i fornitori con stato TRUE e V2 i fornitori con stato FALSE in questo modo posso calcolare l'affidabilità

SELECT fornitore, count(*)
FORM OrdineForntiore
WHERE ricevuto = 0
GROUP BY fornitore;

e allo stesso modo per i TRUE

ma è sbagliato.. non so proprio come farla..

mathfinder
hamming_burst, te la sai fare?
C'è qualcuno che sa scrivere una soluzione?

hamming_burst
"mathfinder":
Grazie per la risposta,

diciamo che ho provato a risolverla ma la soluzione è sbagliata,
cioè io non so calcolare l'affidabilità.

L'idea era quella di creare due viste V1 e V2,
V1 contiene i fornitori con stato TRUE e V2 i fornitori con stato FALSE in questo modo posso calcolare l'affidabilità

SELECT fornitore, count(*)
FORM OrdineForntiore
WHERE ricevuto = 0
GROUP BY fornitore;

e allo stesso modo per i TRUE

ma è sbagliato.. non so proprio come farla..

ho provato a pensare qualcosa per non utilizzare le viste, ma sembra inesprimibile l'interrogazione senza; cioè gli operatori aggregati non permettono annidamento, perciò la tua soluzione è in parte corretta:

CREATE VIEW MerceConsegnata
AS SELECT fornitore, count(ALL ricevute) AS merceRicevuta
FROM OrdineFornitore
WHERE ricevute=TRUE
GROUP_BY fornitore

CREATE VIEW MerceNonConsegnata
AS SELECT fornitore, COUNT(ALL ricevute) AS merceNonRicevuta
FROM OrdineFornitore
WHERE ricevute=FALSE
GROUP_BY fornitore

CREATE VIEW Affidabilita
AS SELECT C.fornitore, C.merceRicevuta/N.merceNonRicevuta AS affidabilita
FROM MerceConsegnata as C, MerceNonConsegnata as N
WHERE C.fornitore=N.fornitore

interrogazione SQL:

SELECT fornitore, MAX(affidabilita)
FROM Affidabilita


prova così ora non mi viene in mente altro. Ma secondo me si può fare molto meglio :-)

mathfinder
Grazie per la risposta,

a questa soluzione c'avevo pensato pure io ed ho tentato di descriverla nel primo post.. ma NON è corretta infatti:
supponiamo che ci sia un fornitore (F1) che non abbia mai fallito (quindi ha sempre consegnato la merce) e che abbia il maggior numero di merce consegnata rispetto agli altri fornitori presenti (quello con affidabilità maggiore),
secondo le tue viste, F1 comparirebbe solo in MerceConsegnata e non in MerceNonConsegnata, pertanto quando vai a fare il join nell'ultima vista (Affidabilità) questo non verrebbe considerato anche se il piu affidabile.

Mi sono spiegato?
Il problema nasce dal fatto che quando si divide quelli con ricevuto = 0 e quelli con ricevuto = 1 alcuni fornitori fanno parte di una tabella e altri di un'altra e invece dovrebbero stare tutti in tutte e due le tabelle in modo poi da fare il join.

nella tabella MerceConsegnata dovrebbero esserci tutti i fornitori ma se un fornitore non ha consegnato nessuna merce accanto dovrebbe esserci 0.

hamming_burst
"mathfinder":

Il problema nasce dal fatto che quando si divide quelli con ricevuto = 0 e quelli con ricevuto = 1 alcuni fornitori fanno parte di una tabella e altri di un'altra e invece dovrebbero stare tutti in tutte e due le tabelle in modo poi da fare il join.

sì hai ragione non avevo pensato al fatto che ci sia tutto FALSE o tutto TRUE :)

In questo caso si può pensare di creare una nuova vista (lasciando un attimo da parte se è la soluzione migliore) e fare i JOIN con Affidabilita come hai proposto, però utilizziamo l'OUTERJOIN:
- utilizzare valore NULL (invece che 0) per far corrispondere il dato che ci son state tutte le consegne e nessuna non ricevutase. Risultato: fornitore NULL
- utilizzare il valore non presente in Affidibilità ma presente in MerceConsegnata come valore di affidabilita massima nel caso che ci siano state tutte le consegne ricevute.

Nel caso: nessuna consegna ricevuta cioè tutto FALSE, nessun TRUE è inutile considerarla perchè non sarebbe MAI affidabile. Sarebbe un altro esercizio.


nella tabella MerceConsegnata dovrebbero esserci tutti i fornitori ma se un fornitore non ha consegnato nessuna merce accanto dovrebbe esserci 0.

questo non è possibile direttamente perchè nel DB se un fornitore NON ha consegne FALSE non ci sarà tale tupla. Ma bisogna forzarla con un valore NULL.

vedi se ti è un po' chiaro cosa ho descritto (se è corretto...), ne riparliamo se no.

danny.m
puoi provare con:
SELECT affidabilità as (COUNT(SELECT * FROM ordineFornitore WHERE fornitore = il tuo fornitore) - COUNT(SELECT * FROM ordineForniture WHERE fornitore = il tuo fornitore AND ricevuto = TRUE)) FROM ordineFornitore WHERE fornitore = il tuo fornitore 


(quindi senza usare delle viste )
dobrebbe funzionare ^^

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.