Queer European MD passionate about IT
Davte преди 4 години
родител
ревизия
eabbc286fa

+ 3 - 0
.gitignore

@@ -1,6 +1,9 @@
 # ---> TeX
 out/
 
+# SQLite database files
+*.db
+
 ## Core latex/pdflatex auxiliary files:
 *.aux
 *.lof

+ 11 - 9
compitino/secondo_compitino/queries.tex

@@ -87,9 +87,10 @@ WHERE EXISTS (SELECT *
         (r2.IdBirrificio @$\neq$@ r1.IdBirrificio)}
 \end{lstlisting}
 
-    \textbf{Scrivo quindi la query:}
+    \textbf{Scrivo quindi la query}, inserendo l'IdPersona e la parola chiave
+    \texttt{DISTINCT} per rimuovere i duplicati (ma non le persone omonime).
 \begin{lstlisting}[style=SQLu,escapechar=@]
-SELECT p1.Nome, p1.Cognome
+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
@@ -106,15 +107,16 @@ WHERE NOT EXISTS (SELECT *
     \item Uso di subquery di confronto quantificato.
 
     Per ogni birrificio, mostrare l'IdBirrificio e l'ultimo NumeroLotto
-    prodotto in quel birrificio (sapendo che il NumeroLotto è progressivo e che
-    ogni ricetta è produtta in un solo birrificio).
+    prodotto in quel birrificio (sapendo che il NumeroLotto è progressivo).
 \begin{lstlisting}[style=SQLu,escapechar=@]
-SELECT r.IdBirrificio, pro1.NumeroLotto
+SELECT r1.IdBirrificio, pro1.NumeroLotto
 FROM Produzioni pro1
-JOIN Ricette r ON r.IdRicetta = pro1.IdRicetta
-WHERE pro.NumeroLotto >= ANY (SELECT pro2.NumeroLotto
-                              FROM Produzioni Pro2
-                              WHERE pro2.IdRicetta = pro1.IdRicetta)
+JOIN Ricette r1 ON r1.IdRicetta = pro1.IdRicetta
+WHERE pro1.NumeroLotto >= ANY (SELECT pro2.NumeroLotto
+                               FROM Produzioni pro2
+                               JOIN Ricette r2
+                                    ON r2.IdRicetta = pro2.IdRicetta
+                               WHERE r2.IdBirrificio = r1.IdBirrificio)
 \end{lstlisting}
 \end{enumerate}
 \clearpage

+ 32 - 30
compitino/secondo_compitino/schema_concettuale.tex

@@ -9,43 +9,44 @@ ingredienti, rassicurandol* che avrei fornito una vista logica ``Inventario".
 \begin{lstlisting}[style=SQLu][float,floatplacement=H]
 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)
+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 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)
+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 IngredientiUsati (IdIngrediente, Ingrediente,
-                              QuantitàUsata)
-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)
+                              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 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)
+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;
 \end{lstlisting}
 
 Ogni volta che si inizia una produzione, l'applicazione controlla che  la
@@ -89,6 +90,7 @@ birrificio per cui lavora.
         \item Ogni prenotazione deve fare riferimento a una produzione.
         \item Ogni prenotazione deve fare riferimento ad un* cliente.
         \item Ogni produzione deve seguire una ricetta.
+        \item Due produzioni di uno stesso birrificio non devono avere lo stesso lotto.
         \item Ogni ricetta deve avere un* creat*r* e un birrificio di riferimento.
         \item Ogni fattura deve fare riferimento ad un birrificio e un fornitore.
         \item Ogni acquisto deve riferirsi a una fattura e un ingrediente.

Файловите разлики са ограничени, защото са твърде много
+ 8 - 0
compitino/secondo_compitino/test/data.sql


Файловите разлики са ограничени, защото са твърде много
+ 108 - 0
compitino/secondo_compitino/test/data_and_schema.sql


+ 192 - 0
compitino/secondo_compitino/test/schema.sql

@@ -0,0 +1,192 @@
+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;

Някои файлове не бяха показани, защото твърде много файлове са промени