Skillbook Logo
foto profilo

Skill Factory

Tutte le categorie


Ricominciamo ... dal linguaggio SQL Lezione 12

Gino Visciano | Skill Factory - 26/04/2016 23:39:50 | in Tutorials

Benvenuti alla dodicesima lezione, in questa nuova lezione vedrete la clausola Group By del comando Select.

Il comando Select utilizza la clausola Group By combinata con le funzioni statistiche per ottenere viste con SUBTOTALI, in base alle chiavi di raggruppamento indicate.

Per capire come funziona la clausola Group By partiamo dalla query seguente, che ordina il contenuto della tabella utilizzando come chiave di ordinamento il nominativo del cliente.

 

select fat.num_fat, fat.data, cli.nominativo, fat.imponibile, ts.tipo_scadenza  from fatture as fat join clienti as cli on(fat.id_cliente=cli.id) join tipo_scadenza as ts on(fat.id_tipo_scadenza=ts.id) order by cli.nominativo;

 

num_fat data nominativo imponibile tipo_scadenza
0015/16 2016-03-31 Aldebran 800.00 30 DFFM
0009/16 2016-02-29 Aldebran 1800.00 30 DFFM
0003/16 2016-01-15 Aldebran 1500.00 30 DFFM
0016/16 2016-03-31 Cassandra 1600.00 30 DFFM
0010/16 2016-02-29 Cassandra 600.00 30 DFFM
0004/16 2016-01-15 Cassandra 500.00 30 DFFM
0008/16 2016-02-29 Fiorini & Figli 2100.00 30 gg DF
0002/16 2016-01-15 Fiorini & Figli 2000.00 30 gg DF
0014/16 2016-03-31 Fiorini & Figli 900.00 30 gg DF
0013/16 2016-03-31 Morgan & C. 1900.00 30 gg DF
0007/16 2016-02-29 Morgan & C. 1500.00 30 gg DF
0001/16 2016-01-15 Morgan & C. 1000.00 30 gg DF
0017/16 2016-03-31 Pedretti 2000.00 60 gg DF
0011/16 2016-02-29 Pedretti 1900.00 60 gg DF
0005/16 2016-01-15 Pedretti 1800.00 60 gg DF
0018/16 2016-03-31 Staiano 1000.00 60 DFFM
0012/16 2016-02-29 Staiano 900.00 60 DFFM
0006/16 2016-01-29 Staiano 800.00 60 DFFM

 

La tabella che si ottine eseguendo la query, appare ordinata in base alla colonna nominativo cliente, il punto in cui cambia il nominativo del cliente si chiama rottura di codice ed indica la fine del gruppo precedente e l'inizio del gruppo seguente.  Ogni gruppo caratterizzato dalla rottura di codice è una SOTTOTABELLA a cui si possono applicare le funzioni statistiche se si utilizza la clausola Group By.  

Vediamo alcuni esempi:

1) Qual è il fatturato di ogni cliente?

select cli.nominativo, sum(fat.imponibile)  as "fatturato" from fatture as fat join clienti as cli on(fat.id_cliente=cli.id) join tipo_scadenza as ts on(fat.id_tipo_scadenza=ts.id) group by cli.nominativo;

nominativo fatturato
Aldebran 4100.00
Cassandra 2700.00
Fiorini & Figli 5000.00
Morgan & C. 4400.00
Pedretti 5700.00
Staiano 2700.00

 

Attenzione, quando usate la clausola Group By, non dimenticate che le colonne della select  devono corrispondere alle chiavi di raggruppamento e alle funzioni statistiche da utilizzare.

2) Qual è il fatturato di ogni cliente e quante fatture ha emesso?

select cli.nominativo, count(*) as "fatture emesse", sum(fat.imponibile) as "fatturato"  from fatture as fat join clienti as cli on(fat.id_cliente=cli.id) join tipo_scadenza as ts on(fat.id_tipo_scadenza=ts.id) group by cli.nominativo;

nominativo fatture emesse fatturato
Aldebran 3 4100.00
Cassandra 3 2700.00
Fiorini & Figli 3 5000.00
Morgan & C. 3 4400.00
Pedretti 3 5700.00
Staiano 3 2700.00

 

3) Quali clienti in totale hanno fatto un fatturato inferiore a €5000.00?

select cli.nominativo, sum(fat.imponibile)  as "fatturato" from fatture as fat join clienti as cli on(fat.id_cliente=cli.id) join tipo_scadenza as ts on(fat.id_tipo_scadenza=ts.id) group by cli.nominativo having sum(fat.imponibile)<5000.00;

oppure

select cli.nominativo, sum(fat.imponibile)  as "fatturato" from fatture as fat join clienti as cli on(fat.id_cliente=cli.id) join tipo_scadenza as ts on(fat.id_tipo_scadenza=ts.id) group by cli.nominativo having fatturato<5000.00;

nominativo fatturato
Aldebran 4100.00
Cassandra 2700.00
Morgan & C. 4400.00
Staiano 2700.00

 

La clausola Having permette di inserire una condizione di selezione sul risultato del Group By.

 


<< Lezione precedente           Lezione successiva >>


T U T O R I A L S    S U G G E R I T I


Share Button

Ricominciamo ... dal linguaggio SQL Lezione 11

Gino Visciano | Skill Factory - 25/04/2016 22:59:46 | in Tutorials

Benvenuti all'undicesima lezione, in questa nuova lezione vedrete le funzioni statistiche del comando Select.

Le funzioni statistiche sono molto utili perché forniscono informazioni di aggregazione rispetto a tutti i dati presenti nelle colonne numeriche indicate.

Le principali  funzioni statistiche sono le seguenti:

 

  • SUM(NomeColonna)    Somma i valori della colonna indicata, si può applicare solo a colonne numeriche;
  • AVG(NomeColonna)     Calcola la Media dei valori della colonna indicata, si può applicare solo a colonne numeriche;
  • MIN(NomeColonna)     Restituisce il valore Minimo della colonna indicata, si può applicare solo a colonne numeriche;
  • MAX(NomeColonna)     Restituisce il valore Massimo della colonna indicata, si può applicare solo a colonne numeriche;
  • COUNT(NomeColonna)    Si usa per contareil numero di righe della tabella, si può applicare a qualunque tipo di colonna, spesso si usa nella forma COUNT(*).

 

Ad esempio per conoscere il numero di dipendenti inserito nella tabella Dipendenti, su può usare il comando seguente:

Select count(*) from Dipendenti;

10

Per vedere praticamente come si usano le funzioni statistiche eseguite prima gli step seguenti, nel Database azienda:

STEP 1: Creare la tabella Clienti.

use azienda;

create table clienti (
id int auto_increment Primary Key,
nominativo varchar(100),
piva char(11) unique,
indirizzo varchar(100),
localita varchar(50),
provincia char(2));
 

STEP 2: Creare la tabella Fatture.

use azienda;

create table fatture (
id int auto_increment Primary Key,
num_fat varchar(20) unique,
data date,
id_cliente int,
imponibile decimal(9,2),
id_tipo_scadenza int);

use azienda;

create table tipo_scadenza (
id int auto_increment Primary Key,
tipo_scadenza varchar(100));

STEP 3: Inserimento Clienti.

use azienda;

insert into clienti (nominativo, localita, provincia) values ('Morgan & C.', 'Roma','RM');

insert into clienti (nominativo, localita, provincia) values ('Fiorini & Figli', 'Napoli','NA');

insert into clienti (nominativo, localita, provincia) values ('Aldebran', 'Milano','MI');

insert into clienti (nominativo, localita, provincia) values ('Cassandra', 'Roma','RM');

insert into clienti (nominativo, localita, provincia) values ('Pedretti', 'Napoli','NA');

insert into clienti (nominativo, localita, provincia) values ('Staiano', 'Milano','MI');


STEP 4: Inserimento Tipo_scadenza.

use azienda;

insert into tipo_scadenza (tipo_scadenza) values ('Rimessa diretta');

insert into tipo_scadenza (tipo_scadenza) values ('30 gg DF');

insert into tipo_scadenza (tipo_scadenza) values ('30 DFFM');

insert into tipo_scadenza (tipo_scadenza) values ('60 gg DF');

insert into tipo_scadenza (tipo_scadenza) values ('60 DFFM');

insert into tipo_scadenza (tipo_scadenza) values ('90 gg DF');

insert into tipo_scadenza (tipo_scadenza) values ('90 DFFM');


STEP 5: Inserimento Fatture.

use azienda;

insert into fatture (num_fat, data, id_cliente, imponibile, id_tipo_scadenza) values ('0001/16', '2016/01/15', 1,1000.00,2);

insert into fatture (num_fat, data, id_cliente, imponibile, id_tipo_scadenza) values ('0002/16', '2016/01/15', 2,2000.00,2);

insert into fatture (num_fat, data, id_cliente, imponibile, id_tipo_scadenza) values ('0003/16', '2016/01/15', 3,1500.00,3);

insert into fatture (num_fat, data, id_cliente, imponibile, id_tipo_scadenza) values ('0004/16', '2016/01/15', 4,500.00,3);

insert into fatture (num_fat, data, id_cliente, imponibile, id_tipo_scadenza) values ('0005/16', '2016/01/15', 5,1800.00,4);

insert into fatture (num_fat, data, id_cliente, imponibile, id_tipo_scadenza) values ('0006/16', '2016/01/29', 6,800.00,5);

insert into fatture (num_fat, data, id_cliente, imponibile, id_tipo_scadenza) values ('0007/16', '2016/02/29', 1,1500.00,2);

insert into fatture (num_fat, data, id_cliente, imponibile, id_tipo_scadenza) values ('0008/16', '2016/02/29', 2,2100.00,2);

insert into fatture (num_fat, data, id_cliente, imponibile, id_tipo_scadenza) values ('0009/16', '2016/02/29', 3,1800.00,3);

insert into fatture (num_fat, data, id_cliente, imponibile, id_tipo_scadenza) values ('0010/16', '2016/02/29', 4,600.00,3);

insert into fatture (num_fat, data, id_cliente, imponibile, id_tipo_scadenza) values ('0011/16', '2016/02/29', 5,1900.00,4);

insert into fatture (num_fat, data, id_cliente, imponibile, id_tipo_scadenza) values ('0012/16', '2016/02/29', 6,900.00,5);

insert into fatture (num_fat, data, id_cliente, imponibile, id_tipo_scadenza) values ('0013/16', '2016/03/31', 1,1900.00,2);

insert into fatture (num_fat, data, id_cliente, imponibile, id_tipo_scadenza) values ('0014/16', '2016/03/31', 2,900.00,2);

insert into fatture (num_fat, data, id_cliente, imponibile, id_tipo_scadenza) values ('0015/16', '2016/03/31', 3,800.00,3);

insert into fatture (num_fat, data, id_cliente, imponibile, id_tipo_scadenza) values ('0016/16', '2016/03/31', 4,1600.00,3);

insert into fatture (num_fat, data, id_cliente, imponibile, id_tipo_scadenza) values ('0017/16', '2016/03/31', 5,2000.00,4);

insert into fatture (num_fat, data, id_cliente, imponibile, id_tipo_scadenza) values ('0018/16', '2016/03/31', 6,1000.00,5);


Dopo che avete completato i 5 step,  potete  usare le tabelle create e popolate per vedere come si usano le funzioni statistiche del comando Select, di seguito vediamo alcuni esempi:

La query seguente mette in relazione tutte le tabelle create e ne visualizza il contenuto:

select fat.num_fat, fat.data, cli.nominativo, fat.imponibile, ts.tipo_scadenza  from fatture as fat join clienti as cli on(fat.id_cliente=cli.id) join tipo_scadenza as ts on(fat.id_tipo_scadenza=ts.id) order by cli.nominativo;

 

num_fat data nominativo imponibile tipo_scadenza
0015/16 2016-03-31 Aldebran 800.00 30 DFFM
0009/16 2016-02-29 Aldebran 1800.00 30 DFFM
0003/16 2016-01-15 Aldebran 1500.00 30 DFFM
0016/16 2016-03-31 Cassandra 1600.00 30 DFFM
0010/16 2016-02-29 Cassandra 600.00 30 DFFM
0004/16 2016-01-15 Cassandra 500.00 30 DFFM
0008/16 2016-02-29 Fiorini & Figli 2100.00 30 gg DF
0002/16 2016-01-15 Fiorini & Figli 2000.00 30 gg DF
0014/16 2016-03-31 Fiorini & Figli 900.00 30 gg DF
0013/16 2016-03-31 Morgan & C. 1900.00 30 gg DF
0007/16 2016-02-29 Morgan & C. 1500.00 30 gg DF
0001/16 2016-01-15 Morgan & C. 1000.00 30 gg DF
0017/16 2016-03-31 Pedretti 2000.00 60 gg DF
0011/16 2016-02-29 Pedretti 1900.00 60 gg DF
0005/16 2016-01-15 Pedretti 1800.00 60 gg DF
0018/16 2016-03-31 Staiano 1000.00 60 DFFM
0012/16 2016-02-29 Staiano 900.00 60 DFFM
0006/16 2016-01-29 Staiano 800.00 60 DFFM

 

Partendo da questa tabella, usando le funzioni statistiche, potete rispondere alle domande seguenti:

1) Quante fatture sono state inserite nella tabella fatture?

use azienda;
select count(*) from fatture;
18

2) Qual è il valore totale del fatturato inserito nella tabella fatture?

use azienda;
select sum(imponibile) from fatture;
24600.00

3) Qual è il valore medio del fatturato inserito nella tabella fatture?

use azienda;
select avg(imponibile) from fatture;
1366.66

4) Qual è il fatturato minimo inserito nella tabella fatture?

use azienda;
select min(imponibile) from fatture;
500.00

5) Qual è il fatturato massimo inserito nella tabella fatture?

use azienda;
select max(imponibile) from fatture;
2100.00

6) Quante fatture sono state inserite nella tabella fatture nel il mese di gennaio?

use azienda;
select count(*) from fatture where data>='2016-01-01' and data<='2016-01-31'; 
6

7) Qual è il fatturato totale inserito nella tabella fatture nel mese di gennaio?

use azienda;
select sum(imponibile) from fatture where data>='2016-01-01' and data<='2016-01-31'; 
7600.00

8) Qual è il fatturato totale del cliente Cassandra inserito nella tabella fatture?

use azienda;
select clienti.nominativo, sum(fatture.imponibile) from fatture  join clienti on (fatture.id_cliente=clienti.id) where clienti.nominativo='Cassandra';
Cassandra   2700.00

9) Qual è il fatturato totale dei clienti di Roma inserito nella tabella fatture?

use azienda;
select clienti.localita, sum(fatture.imponibile) from fatture join clienti on (fatture.id_cliente=clienti.id) where clienti.localita='Roma';
Roma  7100,00

10)  Qual è il fatturato totale dei clienti di Roma inserito nella tabella fatture nel mese di gennaio?

use azienda;
select clienti.localita, sum(fatture.imponibile) from fatture join clienti on (fatture.id_cliente=clienti.id) where clienti.localita='Roma' and data>='2016-01-01' and data<='2016-01-31';
Roma  1500.00

 


<< Lezione precedente           Lezione successiva >>


T U T O R I A L S    S U G G E R I T I


Share Button

Ricominciamo ... dal linguaggio SQL Lezione 10

Gino Visciano | Skill Factory - 25/04/2016 00:21:34 | in Tutorials

Benvenuti alla decima lezione, in questa lezione imparerete ad applicare il Self Join.  Un Self Join non è altro che un Join applicato alla stessa tabella.

Per capire come funziona questo tipo di Join, immaginate di avere una tabella Dipendenti, in cui è presente anche l'id del responsabile di ogni dipendente. La particolarità di questa tabelle è che il responsabile di un dipendente è anche lui un dipendente, quindi è presente nella stessa tabella.

La caratteristica importante della tabella Dipendenti è che contine contemporaneamente, sia la chiave primaria, che la chiave esterna, come mostra l'immagine seguente:

Per distinguere le due tabelle con lo stesso nome dovete usare due alias di tabella differenti, come mostra l'esempio seguente:

SELECT col1,col2, ..., coln FROM tabella_a AS a JOIN tabella_a AS b ON ( ... );

Per vedere come si applica praticamente un Self Join, facciamo le seguenti considerazioni:

1) Rossi Alberto è l'Amministratore dell'azienda quindi non ha responsabili;

2) Verdi Carlo è il Direttore Generale dell'Azienda, il suo responsabile è Rossi Alberto;

3) Bianchi Silvia è il Direttore Commerciale dell'Azienda, il suo Responsabile è Verdi Carlo;

4) Neri Mara è il Responsabile delle Risorse Umane, il suo Responsabile è Verdi Carlo;

5) Rossi Luca è un Commerciale, il suo Responsabile è Bianchi Silvia;

6) Verdi Laura è un Commerciale, il suo Responsabile è Bianchi Silvia;

7) Bianchi Loredana è una Segretaria, il suo Responsabile è Neri Mara;

8) Rossi Valentina è un'Addetta all'Amministrazione, il suo Responsabile è Neri Mara;

9) Bianchi Paola  è un'Addetta all'Amministrazione, il suo Responsabile è Neri Mara;

10) Neri Marcella è un'Addetta alla Reception, il suo Responsabile è Neri Mara;

 

Per creare il Database Azienda, implementate lo Schema Fisico seguente:

 

Attraverso i comandi seguenti potete implementare il Database Azienda, in MySQL, se state usando un DBMS diverso potrebbero esserci delle differenze.

I comandi devono essere eseguiti nella sezione SQL del pannello di controllo phpMyAdmin.

 

STEP 1: Creazione del Database Azienda

1) Create il Database:

create database azienda;

2) Create la tabella Dipendenti:

use azienda; -- connettiti al db azienda
create table dipendenti (
    id int AUTO_INCREMENT PRIMARY KEY,
    matricola char(5) UNIQUE,
    cognome varchar(50) NOT NULL,
    nome varchar(50) NOT NULL,
    cod_fisc char(16) UNIQUE,
    luogo_di_nascita varchar(50),
    data_di_nascita date,
    id_ruolo int NOT NULL,
    id_responsabile int);


3) Create la tabella Ruoli:

use azienda; -- connettiti al db azienda
create table ruoli (
    id int AUTO_INCREMENT PRIMARY KEY,
    ruolo varchar(50) NOT NULL);

 

STEP 2: Inserire i ruoli nella Tabella Ruoli

use azienda; -- connettiti al db azienda

insert into ruoli (ruolo) values ('Amministratore');

insert into ruoli (ruolo) values ('Direttore Generale');

insert into ruoli (ruolo) values ('Direttore Commerciale');

insert into ruoli (ruolo) values ('Reaponsabile Risorse Umane');

insert into ruoli (ruolo) values ('Commerciale');

insert into ruoli (ruolo) values ('Segretaria');

insert into ruoli (ruolo) values ('Addetto Amministrazione');

insert into ruoli (ruolo) values ('Addetto Reception');

insert into ruoli (ruolo) values ('Addetto Delivery');

insert into ruoli (ruolo) values ('Responsabile Sicurezza');

Il risultato del lavoro fatto è il seguente:

select * from ruoli:

1 Amministratore
2 Direttore Generale
3 Direttore Commerciale
4 Reaponsabile Risorse Umane
5 Commerciale
6 Segretaria
7 Addetto Amministrazione
8 Addetto Reception
9 Addetto Delivery
10 Responsabile Sicurezza

 

STEP 3: Inserire i Dipendenti nella Tabella Dipendenti

insert into dipendenti (matricola, cognome, nome, luogo_di_nascita, data_di_nascita, id_ruolo, id_responsabile)
                    values ('RA001', 'Rossi', 'Alberto','Roma','1970/12/10',1,null);

insert into dipendenti (matricola, cognome, nome, luogo_di_nascita, data_di_nascita, id_ruolo, id_responsabile)
                    values ( 'VC002','Verdi', 'Carlo','Latina','1975/04/20', 2,1);

insert into dipendenti (matricola, cognome, nome, luogo_di_nascita, data_di_nascita, id_ruolo, id_responsabile)
                    values ('BS003','Bianchi', 'Silvia','Rieti', '1980/02/05', 3,2);

insert into dipendenti (matricola, cognome, nome, luogo_di_nascita, data_di_nascita, id_ruolo, id_responsabile)
                    values ('NM004', 'Neri', 'Mara', 'Napoli', '1978/05/10', 4,2);

insert into dipendenti (matricola, cognome, nome, luogo_di_nascita, data_di_nascita, id_ruolo, id_responsabile)
                    values ('RL005','Rossi', 'Luca', 'Salerno','1972/09/15', 5, 3);

insert into dipendenti (matricola, cognome, nome, luogo_di_nascita, data_di_nascita, id_ruolo, id_responsabile)
                    values ('VL006','Verdi', 'Laura', 'Roma', '1973/11/08', 5,3);

insert into dipendenti (matricola, cognome, nome, luogo_di_nascita, data_di_nascita, id_ruolo, id_responsabile)
                    values ('BL007', 'Bianchi', 'Loredana', 'Latina', '1982/03/04', 6,4);

insert into dipendenti (matricola, cognome, nome, luogo_di_nascita, data_di_nascita, id_ruolo, id_responsabile)
                    values ('RV008','Rossi', 'Valentina', 'Napoli', '1986/07/13', 7, 4);

insert into dipendenti (matricola, cognome, nome, luogo_di_nascita, data_di_nascita, id_ruolo, id_responsabile)
                    values ('BP009', 'Bianchi', 'Paola',  'Benevento', '1975/06/25', 7,4);

insert into dipendenti (matricola, cognome, nome, luogo_di_nascita, data_di_nascita, id_ruolo, id_responsabile)
                    values ('NM010', 'Neri', 'Marcella', 'Salerno', '1979/05/28', 8,4);

Il risultato del lavoro fatto è il seguente:

select id, matricola, cognome, nome, luogo_di_nascita, data_di_nascita, id_ruolo, id_responsabile from dipendenti;

id matricola cognome nome luogo_di_nascita data_di_nascita id_ruolo id_responsabile
1 RA001 Rossi Alberto Roma 1970-12-10 1 NULL
2 VC002 Verdi Carlo Latina 1975-04-20 2 1
3 BS003 Bianchi Silvia Rieti 1980-02-05 3 2
4 NM004 Neri Mara Napoli 1978-05-10 4 2
5 RL005 Rossi Luca Salerno 1972-09-15 5 3
6 VL006 Verdi Laura Roma 1973-11-08 5 3
7 BL007 Bianchi Loredana Latina 1982-03-04 6 4
8 RV008 Rossi Valentina Napoli 1986-07-13 7 4
9 BP009 Bianchi Paola Benevento 1975-06-25 7 4
10 NM010 Neri Marcella Salerno 1979-05-28 8 4

 

Creazione di una Query per visualizzare i Dipendenti, i Ruoli ed i Responsabili

Per creare la Query richiesta, serve un INNER JOIN tra la tabella Dipendenti e la tabella Ruoli, per visualizzare i ruoli e un SELF JOIN sulla tabella Dipendenti per visualizzare i Responsabili, il comando seguente vi permette di ottenere questo risultato:

select d1.id, d1.matricola, d1.cognome, d1.nome, d1.luogo_di_nascita, d1.data_di_nascita, r.ruolo, d2.cognome, d2.nome
            from dipendenti as d1 join dipendenti as d2 on (d1.id_responsabile=d2.id) join ruoli as r on (d1.id_ruolo=r.id);

 

id matricola cognome nome luogo_di_nascita data_di_nascita ruolo cognome nome
2 VC002 Verdi Carlo Latina 1975-04-20 Direttore Generale Rossi Alberto
3 BS003 Bianchi Silvia Rieti 1980-02-05 Direttore Commerciale Verdi Carlo
4 NM004 Neri Mara Napoli 1978-05-10 Responsabile Risorse Umane Verdi Carlo
5 RL005 Rossi Luca Salerno 1972-09-15 Commerciale Bianchi Silvia
6 VL006 Verdi Laura Roma 1973-11-08 Commerciale Bianchi Silvia
7 BL007 Bianchi Loredana Latina 1982-03-04 Segretaria Neri Mara
8 RV008 Rossi Valentina Napoli 1986-07-13 Addetto Amministrazione Neri Mara
9 BP009 Bianchi Paola Benevento 1975-06-25 Addetto Amministrazione Neri Mara
10 NM010 Neri Marcella Salerno 1979-05-28 Addetto Reception Neri Mara

L'Amministratore Rossi Alberto,corrispondente all'id 1, non viene visualizzato perché l'id_responsabile è uguale a null, quindi la condizione d1.id_responsabile=d2.id non è verificata, in un INNER JOIN oppure in un SELF JOIN vengono visualizzati solo i record che soddisfano la condizione chiave esterna uguale a chiave primaria.

Per visualizzare anche l'Amministratore dell'Azienda, dovete usare un LEFT JOIN, come mostra il comando seguente:

select d1.id, d1.matricola, d1.cognome, d1.nome, d1.luogo_di_nascita, d1.data_di_nascita, r.ruolo, d2.cognome, d2.nome
            from dipendenti as d1 left join dipendenti as d2 on (d1.id_responsabile=d2.id) left join ruoli as r on (d1.id_ruolo=r.id);

id matricola cognome nome luogo_di_nascita data_di_nascita ruolo cognome nome
1 RA001 Rossi Alberto Roma 1970-12-10 Amministratore null null
2 VC002 Verdi Carlo Latina 1975-04-20 Direttore Generale Rossi Alberto
3 BS003 Bianchi Silvia Rieti 1980-02-05 Direttore Commerciale Verdi Carlo
4 NM004 Neri Mara Napoli 1978-05-10 Responsabile Risorse Umane Verdi Carlo
5 RL005 Rossi Luca Salerno 1972-09-15 Commerciale Bianchi Silvia
6 VL006 Verdi Laura Roma 1973-11-08 Commerciale Bianchi Silvia
7 BL007 Bianchi Loredana Latina 1982-03-04 Segretaria Neri Mara
8 RV008 Rossi Valentina Napoli 1986-07-13 Addetto Amministrazione Neri Mara
9 BP009 Bianchi Paola Benevento 1975-06-25 Addetto Amministrazione Neri Mara
10 NM010 Neri Marcella Salerno 1979-05-28 Addetto Reception Neri Mara


Utilizzando gli alias di colonna ed il concatenamento tra le colonne potete rendere il report ancora più professionale, come mostra il comando seguente:

select d1.id, d1.matricola, concat(d1.cognome, ' ', d1.nome) as "dipendente", d1.luogo_di_nascita, d1.data_di_nascita, r.ruolo, concat(d2.cognome, ' ',  d2.nome) as "responsabile"
            from dipendenti as d1 left join dipendenti as d2 on (d1.id_responsabile=d2.id) left  join ruoli as r on (d1.id_ruolo=r.id);

id matricola dipendente luogo_di_nascita data_di_nascita ruolo responsabile
1 RA001 Rossi Alberto Roma 1970-12-10 Amministratore null
2 VC002 Verdi Carlo Latina 1975-04-20 Direttore Generale Rossi Alberto
3 BS003 Bianchi Silvia Rieti 1980-02-05 Direttore Commerciale Verdi Carlo
4 NM004 Neri Mara Napoli 1978-05-10 Responsabile Risorse Umane Verdi Carlo
5 RL005 Rossi Luca Salerno 1972-09-15 Commerciale Bianchi Silvia
6 VL006 Verdi Laura Roma 1973-11-08 Commerciale Bianchi Silvia
7 BL007 Bianchi Loredana Latina 1982-03-04 Segretaria Neri Mara
8 RV008 Rossi Valentina Napoli 1986-07-13 Addetto Amministrazione Neri Mara
9 BP009 Bianchi Paola Benevento 1975-06-25 Addetto Amministrazione Neri Mara
10 NM010 Neri Marcella Salerno 1979-05-28 Addetto Reception Neri Mara

Attenzione la funzione MySQL concat permette di concatenare in un'unica colonna il congnome, uno spazio ed il nome. Con altri DBMS gli operatori di concatnamento sono || (doppio pipe) oppure il segno +, come mostra l'esempio seguente:

select d1.id, d1.matricola, d1.cognome || ' ' ||  d1.nome as "dipendente", d1.luogo_di_nascita, d1.data_di_nascita, r.ruolo, d2.cognome ||  ' ' ||  d2.nome  as "responsabile"
            from dipendenti as d1 left join dipendenti as d2 on (d1.id_responsabile=d2.id)  left join ruoli as r on (d1.id_ruolo=r.id);

Infine, per rendere il report ancora più professionale, con un ulteriore JOIN sulla tabella ruoli, potete anche aggiungere anche il ruolo del Responsabile, come mostra il comando seguente:

select d1.id, d1.matricola, concat(d1.cognome, ' ', d1.nome) as "dipendente", d1.luogo_di_nascita, d1.data_di_nascita, r1.ruolo,
            concat(d2.cognome, ' ',  d2.nome) as "responsabile", r2.ruolo as "ruolo responsabile"
            from dipendenti as d1 left join dipendenti as d2 on (d1.id_responsabile=d2.id) left join ruoli as r1 on (d1.id_ruolo=r1.id) 
           left  join ruoli as r2 on (d2.id_ruolo=r2.id) ;

 

id matricola dipendente luogo_di_nascita data_di_nascita ruolo responsabile ruolo responsabile
1 RA001 Rossi Alberto Roma 1970-12-10 Amministratore null null
2 VC002 Verdi Carlo Latina 1975-04-20 Direttore Generale Rossi Alberto Amministratore
3 BS003 Bianchi Silvia Rieti 1980-02-05 Direttore Commerciale Verdi Carlo Direttore Generale
4 NM004 Neri Mara Napoli 1978-05-10 Responsabile Risorse Umane Verdi Carlo Direttore Generale
5 RL005 Rossi Luca Salerno 1972-09-15 Commerciale Bianchi Silvia Direttore Commerciale
6 VL006 Verdi Laura Roma 1973-11-08 Commerciale Bianchi Silvia Direttore Commerciale
7 BL007 Bianchi Loredana Latina 1982-03-04 Segretaria Neri Mara Responsabile Risorse Umane
8 RV008 Rossi Valentina Napoli 1986-07-13 Addetto Amministrazione Neri Mara Responsabile Risorse Umane
9 BP009 Bianchi Paola Benevento 1975-06-25 Addetto Amministrazione Neri Mara Responsabile Risorse Umane
10 NM010 Neri Marcella Salerno 1979-05-28 Addetto Reception Neri Mara Responsabile Risorse Umane

Attenzione per visualizzare anche l'Amministratore è importante che anche l'ultimo JOIN sia di tipo LEFT .

 


<< Lezione precedente           Lezione successiva >>


T U T O R I A L S    S U G G E R I T I


Share Button

App Mania Lezione 9 - Gestione Sprite - II Parte - (Come far girare l'ago di una bussola)

Gino Visciano | Skill Factory - 23/04/2016 08:26:00 | in Tutorials

Benvenuti alla nona lezione, nella lezione precedente avete preparato le immagini che servono per far girare l'ago della bussola sia in senso orario, che in senso antiorario.

In questa lezione implementerete i blocchi che servono per attivare l'animazione per far girare l'ago.

Come avete già visto nella lezione precedente, per far girare l'ago ogni volta che premete sui pulsanti "Ruota+" e "Ruota-",  dovete sostituire nello Sprite Ago_Bussola l'immagine dell'ago corrente con l'immagine successiva, se avete premuto il pulsante "Ruota+" oppure l'immagine precedente se avete premuto il pulsante "Ruota-", come mostra la sequenza seguente:

 

I nomi delle immagini, sono composti da una parte fissa, la parola ago e da un numero progressivo da 01 .. 12, sfrutterete proprio quest'ultima caratteristica per caricare l'immagine che serve, basta creare un contatore che s'incrementa oppure si decrementa ad ogni operazione.

Con App Inventor per creare un contatore serve una variabile, per inizializzarla eseguite le operazioni seguenti:

1) selezionate l'Area Blocks;

2) aprite la categoria Variables;

3) cliccate sul blocco initialize global;

4) rinominatelo fotogramma;

5) aprite la categoria Math;

6) cliccate sul blocco numero;

7) associate il blocco numero a quello initialize global;

8) assegante al blocco numero il valore 1 per inizializzare la variabile fotogramma, come mostra l'immagine.

Userete la variabile fotogramma, come contatore per richiamare le immagini. Il contatore si dovrà incrementare ogni volta che si clicca sul pulsante "Ruota+" e decrementare quando si clicca sul pulsante "Ruota-", l'immagine seguente mostra come trasformare la variabile fotogramma in un contatore:

ogni volta che viene eseguito questo blocco la variabile fotogramma s'incrementa di 1.

Il blocco somma lo trovate nella categoria Math.

Il blocco get oppure il blocco set, per ottenere oppure assegnare un valore alla variabie fotogramma, lo trovate spostando il cursore del mouse sul blocco initialize global, come mostra l'immagine seguente:

Per caricare l'immagine nello Sprite Ago_Bussola, serve il blocco set Picture, lo trovate nella categoria Ago_Bussola, come mostra l'immagine seguente:

Per comporre il nome dell'immagine, dovete procedere come segue:

1) per i valori da 1 a 9 del contatore, dovete concatenare la parola "ago0" con il valore della variabile "fotogramma" e l'estensione ".png";

2) per i valori da 10 a 12 del contatore, dovete concatenare la parola "ago", senza 0 (zero), con il valore della variabile "fotogramma" e l'estensione ".png".

Per concatenare i due valori tra loro dovete utilizzare il blocco Join, della categoria Text. Nella stessa categoria trovate anche il blocco text string, che permette di aggiungere valori alfanumerici.

Le immagini seguenti mostrano i blocchi da utilizzare per comporre il nome dell'immagine corrente da caricare nello Sprite.

1) Blocchi da usare per i Fotogrammi da 1 a 9:

2) Blocchi da usare per i Fotogrammi da 10 a 12:

Utilizzando un blocco if potete controllare il valore raggiunto dal contatore e decidere quali blocchi usare, come mostra l'immagine seguente:

Il blocco if si comporta nel modo seguente: se fotogramma (il contatore) è minore di 10, componi il nome con la formula "ago0"+fotogramma+".png", altrimenti usa la formula "ago"+fotogramma+".png", perché i per i valori di fotogramma da 10 in poi non serve più lo 0 (zero).

Come avete visto nelle lezioni precedenti il blocco if lo trovate nella categoria Control.

A questo punto per creare l'animazione dell'ago che gira dovete creare le strutture di blocchi seguenti. 

1) Struttura che permette di creare l'animazione per far girare l'ago della bussola in senso orario:

Il blocco Click del pulsante But_ruota_piu lo trovate  nella sezione Blocks, cliccando sul nome del pulsante.

 

2) Struttura che permette di creare l'animazione per far girare l'ago della bussola in senso antiorario:

Il blocco Click del pulsante But_ruota_meno lo trovate  nella sezione Blocks, cliccando sul nome del pulsante.

Per inizializzare lo schermo la prima volta che lanciate l'applicazione, con il primo ago, dovete usare il blocco seguente:

Il blocco Initialize lo trovate  nella sezione Blocks, cliccando sul nome dello schermo Screen1.

L'immagine seguente mostra la parte logica completa dell'APP Bussola:

Per eseguire l'APP Bussola, avviate l'emulatore aiStarter:

 

e avviate l'APP selezionando Connect e cliccando sul comando Emulator.

Se avete l'emulatore sul cellulare, per avviare l'APP dovete procedere come segue:

1) lanciare l'emulatore sul cellulare

2) selezionare Connect sul computer e cliccare sul comando AI Companion

3) Inserire oppure leggere con il QR code il codice visualizzato sul computer. 

L'immagine seguente mostra l'APP in esecizione:


<< Lezione precedente           Lezione successiva >>


T U T O R I A L S    S U G G E R I T I

Share Button

App Mania Lezione 8 - Gestione Sprite - I Parte - (Come far girare l'ago di una bussola)

Gino Visciano | Skill Factory - 16/04/2016 15:43:01 | in Tutorials

Benvenuti all'ottava lezione, in questa lezione imparerete a lavorare con gli Sprite. Gli Sprite sono immagini particolari che permettono di creare animazioni.

In questa e nella prossima lezione svilupperete l'APP BUSSOLA che permette di far girare un Ago sia in senso orario, che in senso antiorario.

Creare un'animazione significa visualizzare una dopo l'altra una sequenza d'immagini, con l'obiettivo di dare all'osservatore la sensazione del movimento. Quindi ogni immagine sarà leggermete diversa dalla precedente, come avvine con i fotogrammi delle pellicole dei film, nell'esempio seguente potete osservare una sequenza di 12 immagini che danno la sensazione di un ago che gira:

utilizzerete questa sequenza d'immagini per far girare l'ago della vostra bussola.

 

Come si usano gli Sprite in APP INVENTOR

Gli Sprite, in APP INVENTOR, possono vivere solo se posizionati all'interno di un Canvas, un pannello sensibile agli eventi generati dagli Sprite, tipo clic, spostamenti e collisioni tra Sprite.

Sia gli Sprite che i Canvas li trovate nella sezione Drawing and Animation del pannello Palette, come mostra l'immagine seguente.

Per usare gli Sprite, basta trascinare un Canvas nello Schermo attivo e poi aggiungere gli Sprite, trascinandoli nel Canvas.

 

Differenza tra immagini jpg e png

Le immagini con estensione jpg (JPEG = Joint Photographic Experts Group) e png (PNG=Portable Network Graphics) sono immagini compresse utilizzate per il Web.  La sostanziale differenza che esiste tra questi due tipi d'immagini è quella che le immagini di tipo png hanno lo sfondo trasparente, quindi se sovrapposte ad un'altra immag Gine, quella in secondo piano appare come sfondo. 

Guardate l'esempio seguente:

Sovrapponendo l'ago della bussola alla bussola, l'immagine è ancora visibile perché lo sfondo dell'ago è trasparente, se aveste fatto la stessa cosa con un'immagine di tipo JPEG la bussola non sarebbe visibile, perché in questo caso lo sfondo dell'ago non sarebbe trasparente.

I programmi più conosciuti per gestire questi tipi di immagini sono: Phtoshop e GIMP, se non avete già un dei due programmi, vi suggerisco d'installare GIMP, è gratuito e semplice da usare.

GIMP lo potete scaricare dal sito : www.gimp.org/downloads.

 

 

Come creare una bussola con l'ago che gira usando APP INVENTOR

Per iniziare posizionatevi sull'immagine seguente, premete il tasto destro del mouse e copiate l'immagine. 

Avviate GIMP, incollate l'immagine e salvatela con il nome bussola.jpg. Attenzione in GIMP per salvare un immagine in formato jpg dovete procedere nel modo seguente:

1) Aprite il menu File

2) Selezionate Esporta come ...

3) Scegliete la cartella in cui salvare

4) Scrivete il nome dell'immagine, in questo caso bussola.jpg

Adesso dovete creare la sequenza d'immagini che servono per far girare l'ago della bussola, quindi posizionatevi sull'immagine seguente, premete il tasto destro del mouse e copiate l'immagine, incollatela in GIMP e salvatela con il nome ago01.png. L'estensione png è importante perché le immagini degli aghi devono avere lo sfondo trasparente.

 

 

Per creare una sequenza d'immagini che permettono di impostare un'animazione per far girare un ago di 360°, occorrono 12 aghi, ciascuno con  una inclinazione di 30° in  più, rispetto al precedente.

Partendo dall'immagine ago01.png, con GIMP è semplice creare le altre 11 immagini, basta utilizzare lo strumento ruota, vediamo come:

1) Aprite l'immagine ago01.png

2) selezionate lo strumento ruota dal pannello degli strumenti

 

3) Cliccate sull'immagine

4) Ruotate l'immagine di 30° in senso orario e confermate cliccando sul pulsante RUOTA, come mostra l'immagine seguente:

5) Salvate l'immagine corrente, selezionando File, Esporta come ... e assegnategli il nome ago02.png

6) Ripetete i punti dal 2 al 5 per creare la sequenza delle 12 immagini.

L'immagine seguente mostra i 12 aghi ed i nomi associati.

 

 

Come impostare lo schermo dell'APP BUSSOLA e caricare le immagini per creare le animazioni

Collegatevi ad APP INVENTOR (https://ai2.appinventor.mit.edu) e create un nuovo progetto di nome bussola. Se non sapete ancora creare un progetto con APP INVENTOR leggete la lezione 1.

Quando siete nell'Area di Designer, eseguite le seguenti operazioni:

1) Trascinate nello schermo attivo un Canvas e chiamatelo Piano, per rinominare un componente basta selezionarlo nella sezione Components e cliccare sul pulsante Rename, come mostra l'immagine seguente;

2) Impostate le proprità Height e Width del Canvas con il valore Fill parent;

3) Trascinate nel Canvas attivo lo Sprite da utilizzare come sfondo della bussula e chiamatelo Bussola;

4) Impostate le proprità Height e Width dello Sprite con il valore 220;

5) Trascinate nel Canvas attivo lo Sprite da utilizzare per gli aghi e chiamatelo Ago_Bussola;

6) Impostate le proprità Height e Width dello Sprite con il valore 170;

7) Trascinate in fondo allo schermo attivo, un Layout orizzontale;

8) Trascinate all'interno del Layout un Button e chiamatelo But_ruota_piu ed impostate la proprietà Text con il valore Ruota+;

9) Trascinate all'interno del Layout un Button e chiamatelo But_ruota_meno ed impostate la proprietà Text con il valore Ruota-;

10) Trascinate all'interno del Layout una Label  e chiamatela Lab_fotogramma ed impostate la proprietà Text con il valore Fotogramma;

11) Trascinate all'interno del Layout una Label  e chiamatela Lab_display ed impostate la proprietà Text con il valore 0;

L'immagine seguente mostra l'aspetto finale dello schermo dell APP BUSSOLA:

Infine dovete caricare tutte le immagini, utilizzando l'UPLOAD della sezione Media, a destra dello schermo attivo, sotto la sezione Components, come mostra l'immagine seguente:

Nella prossima lezione, implementerete i blocchi per far girare gli aghi della bussola sia in senso orario, che in senso antiorario.


<< Lezione precedente           Lezione successiva >>


T U T O R I A L S    S U G G E R I T I

Share Button
TOP