BEGIN TRANSACTION; CREATE TABLE IF NOT EXISTS "Acquisti" ( "IdFattura" INTEGER NOT NULL, "IdIngrediente" INTEGER NOT NULL, "Quantità" INTEGER NOT NULL, PRIMARY KEY("IdFattura","IdIngrediente") ); CREATE TABLE IF NOT EXISTS "Birraie" ( "IdPersona" INTEGER NOT NULL, "Soprannome" TEXT NOT NULL UNIQUE, PRIMARY KEY("IdPersona") ); CREATE TABLE IF NOT EXISTS "Birrifici" ( "IdBirrificio" INTEGER PRIMARY KEY AUTOINCREMENT, "Nome" TEXT, "AnnoFondazione" INTEGER, "Motto" TEXT, "Stemma" BLOB, "CapacitàProduttiva" INTEGER NOT NULL ); CREATE TABLE IF NOT EXISTS "BirrificiBirraie" ( "IdBirrificio" INTEGER NOT NULL, "IdBirraia" INTEGER NOT NULL, PRIMARY KEY("IdBirrificio","IdBirraia") ); CREATE TABLE IF NOT EXISTS "Clienti" ( "IdPersona" INTEGER NOT NULL, "IndirizzoSpedizione" TEXT NOT NULL, PRIMARY KEY("IdPersona") ); CREATE TABLE IF NOT EXISTS "Fatture" ( "IdFattura" INTEGER PRIMARY KEY AUTOINCREMENT, "IdBirrificio" INTEGER NOT NULL, "IdFornitore" INTEGER NOT NULL, "Data" TEXT NOT NULL, "NumeroFattura" INTEGER NOT NULL UNIQUE, "Importo" INTEGER NOT NULL ); CREATE TABLE IF NOT EXISTS "Fornitori" ( "IdFornitore" INTEGER PRIMARY KEY AUTOINCREMENT, "RagioneSociale" TEXT NOT NULL UNIQUE, "PartitaIva" INTEGER NOT NULL UNIQUE, "Indirizzo" TEXT NOT NULL ); CREATE TABLE IF NOT EXISTS "Ingredienti" ( "IdIngrediente" INTEGER PRIMARY KEY AUTOINCREMENT, "IdTipo" INTEGER NOT NULL, "Descrizione" TEXT NOT NULL ); CREATE TABLE IF NOT EXISTS "IngredientiRicette" ( "IdRicetta" INTEGER NOT NULL, "IdIngrediente" INTEGER NOT NULL, "Quantità" INTEGER NOT NULL, PRIMARY KEY("IdRicetta","IdIngrediente") ); CREATE TABLE IF NOT EXISTS "Note" ( "IdNota" INTEGER PRIMARY KEY AUTOINCREMENT, "IdProduzione" INTEGER NOT NULL, "Testo" TEXT NOT NULL ); CREATE TABLE IF NOT EXISTS "NoteDegustazione" ( "IdNota" INTEGER NOT NULL, "Giudizio" INTEGER NOT NULL, PRIMARY KEY("IdNota") ); CREATE TABLE IF NOT EXISTS "Persone" ( "IdPersona" INTEGER PRIMARY KEY AUTOINCREMENT, "Nome" TEXT NOT NULL, "Cognome" TEXT NOT NULL, "Email" TEXT NOT NULL, "CodiceFiscale" TEXT NOT NULL UNIQUE ); CREATE TABLE IF NOT EXISTS "Prenotazioni" ( "IdCliente" INTEGER NOT NULL, "IdProduzione" INTEGER NOT NULL, "Stato" INTEGER, "Quantità" INTEGER NOT NULL, PRIMARY KEY("IdProduzione","IdCliente") ); CREATE TABLE IF NOT EXISTS "Produzioni" ( "IdProduzione" INTEGER PRIMARY KEY AUTOINCREMENT, "IdRicetta" INTEGER NOT NULL, "DataProduzione" TEXT NOT NULL, "NumeroLotto" INTEGER NOT NULL, "Stato" INTEGER, "NumeroBottiglie" INTEGER NOT NULL ); CREATE TABLE IF NOT EXISTS "Ricette" ( "IdRicetta" INTEGER PRIMARY KEY AUTOINCREMENT, "IdBirrificio" INTEGER NOT NULL, "IdCreatrice" INTEGER NOT NULL, "IdRicettaMadre" INTEGER, "Nome" TEXT NOT NULL, "DataCreazione" TEXT NOT NULL, "Stato" INTEGER ); CREATE TABLE IF NOT EXISTS "TipiIngredienti" ( "IdTipo" INTEGER PRIMARY KEY AUTOINCREMENT, "Tipo" TEXT NOT NULL, "UnitàDiMisura" TEXT NOT NULL ); CREATE VIEW Query_a AS SELECT r.IdRicetta, r.Nome FROM Ricette r JOIN Persone p ON p.IdPersona = r.IdCreatrice WHERE p.Nome = 'Giovanni'; CREATE VIEW Query_b AS SELECT fa.IdBirrificio, COUNT(DISTINCT fa.IdFornitore) DiversiFornitori FROM Fatture fa WHERE fa.Data >= '2020-01-01' GROUP BY fa.IdBirrificio HAVING COUNT(DISTINCT fa.IdFornitore) >= 3 ORDER BY COUNT(DISTINCT fa.IdFornitore) DESC; CREATE VIEW Query_c AS SELECT fo.RagioneSociale, SUM(fa.Importo) ImportoTotale, AVG(fa.Importo) ImportoMedio FROM Fornitori fo JOIN Fatture fa ON fa.IdFornitore = fo.IdFornitore JOIN Birrifici b ON b.IdBirrificio = fa.IdBirrificio WHERE b.Nome = 'Pirati Rossi' GROUP BY fo.IdFornitore, fo.RagioneSociale HAVING SUM(fa.Importo) > 10; CREATE VIEW Query_d AS SELECT b.Soprannome FROM Birraie b WHERE EXISTS (SELECT * FROM Ricette r WHERE r.IdCreatrice = b.IdPersona); CREATE VIEW Query_e AS SELECT DISTINCT p1.IdPersona, p1.Nome, p1.Cognome FROM Persone p1 JOIN Prenotazioni pre1 ON pre1.IdCliente = p1.IdPersona JOIN Produzioni pro1 ON pro1.IdProduzione = pre1.IdProduzione JOIN Ricette r1 ON r1.IdRicetta = pro1.IdRicetta WHERE NOT EXISTS (SELECT * FROM Prenotazioni pre2 JOIN Produzioni pro2 ON pro2.IdProduzione = pre2.IdProduzione JOIN Ricette r2 ON r2.IdRicetta = pro2.IdRicetta WHERE pre2.IdCliente = pre1.IdCliente AND r2.IdBirrificio <> r1.IdBirrificio); CREATE VIEW Query_f AS SELECT r1.IdBirrificio, pro1.NumeroLotto FROM Produzioni pro1 JOIN Ricette r1 ON r1.IdRicetta = pro1.IdRicetta WHERE pro1.NumeroLotto = (SELECT MAX(pro2.NumeroLotto) FROM Produzioni pro2 JOIN Ricette r2 ON r2.IdRicetta = pro2.IdRicetta WHERE r2.IdBirrificio = r1.IdBirrificio); CREATE VIEW IngredientiUsati (IdIngrediente, Ingrediente, Usati) AS SELECT i.IdIngrediente IdIngrediente, i.Descrizione Ingrediente, SUM(ir.Quantità) Usati FROM IngredientiRicette ir JOIN Ingredienti i ON i.IdIngrediente = ir.IdIngrediente JOIN Produzioni p ON p.IdRicetta = ir.IdRicetta WHERE p.Stato = 0 GROUP BY i.IdIngrediente, i.Descrizione; CREATE VIEW IngredientiInUso (IdIngrediente, Ingrediente, InUso) AS SELECT i.IdIngrediente IdIngrediente, i.Descrizione Ingrediente, SUM(ir.Quantità) InUso FROM IngredientiRicette ir JOIN Ingredienti i ON i.IdIngrediente = ir.IdIngrediente JOIN Produzioni p ON p.IdRicetta = ir.IdRicetta WHERE p.Stato IS NULL GROUP BY i.IdIngrediente, i.Descrizione; CREATE VIEW IngredientiAcquistatiTotali (IdIngrediente, Ingrediente, Totale) AS SELECT i.IdIngrediente IdIngrediente, i.Descrizione Ingrediente, SUM(a.Quantità) Totale FROM Acquisti a JOIN Ingredienti i ON i.IdIngrediente = a.IdIngrediente GROUP BY i.IdIngrediente, i.Descrizione; CREATE VIEW Inventario (IdIngrediente, Ingrediente, QuantitàTotale, QuantitàDisponibile) AS SELECT iat.IdIngrediente IdIngrediente, iat.Ingrediente Ingrediente, (iat.Totale - COALESCE(iu.Usati, 0)) QuantitàTotale, (iat.Totale - COALESCE(iu.Usati, 0) - COALESCE(iiu.InUso, 0)) QuantitàDisponibile FROM IngredientiAcquistatiTotali iat LEFT JOIN IngredientiUsati iu ON iu.IdIngrediente = iat.IdIngrediente LEFT JOIN IngredientiInUso iiu ON iiu.IdIngrediente = iat.IdIngrediente WHERE iat.Totale - COALESCE(iu.Usati, 0) > 0; COMMIT;