Basi di dati: query
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.
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.

Risposte
Ciao,
hai provato a risolverla? se sì cosa non ti torna o non riesci. Proponi qua la tua soluzione e vediamo cosa non funziona.
"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.
hai provato a risolverla? se sì cosa non ti torna o non riesci. Proponi qua la tua soluzione e vediamo cosa non funziona.
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..
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..
hamming_burst, te la sai fare?
C'è qualcuno che sa scrivere una soluzione?
C'è qualcuno che sa scrivere una soluzione?
"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

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.
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.
"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.
puoi provare con:
(quindi senza usare delle viste )
dobrebbe funzionare ^^
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 ^^