SQL

JiFile per Joomla!

JIFile
JiFile è una componente per Joomla! che permette di indicizzare il contenuto dei file(PDF, DOC, ecc.) per poter effettuare delle ricerche al loro interno.

Scopri di più...  Demo

JoomPhoto Mobile

JPhotoMobile
JoomPhoto Mobile è una componente per Joomla! che ti permette di condividere le foto dal tuo dispositivo Android sul tuo portale Joomla!.

Scopri di più...  Demo

iFile Framework

IFile
IFile è un framework open source scritto interamente in PHP, permette l'indicizzazione dei contenuti testuali di un documento (DOC, PDF, EXCEL, etc) e una rapida ricerca all'interno degli stessi.

Scopri di più...  Demo

Easy Language

EasyLanguage
Easy Language è un plugin per la gestione semplice ed immediata di testi multilingua in ogni parte possibile di joomla, articoli, componenti, moduli, metadata, template, altri componenti(esempio K2) ecc.

Scopri di più...

Article Book Effect

Article Book Effect
Visualizza gli articoli di Joomla con l'effetto volta pagina di un libro. Questo plugin consente di visualizzare il contenuto di un articolo Joomla come un vero e proprio libro o una rivista, utilizzando tutti i vantaggi di HTML5

Scopri di più...  Demo

 

Fototessera

Article Book Effect
La più famosa Android App che ti permette di stampare le foto tessere per i tuoi documenti con il tuo smartphone Android, in modo semplice ed intuitivo.

Scopri di più...

 

Ombra pazza 3D

Ombra pazza 3D
Ombra Pazza è il puzzle game 3D frenetico e divertente per Android! Prova a ruotare le forme portandole nella posizione delle proprie ombre senza mai fallire! Risolvi una dopo l'altra tutte le combinazioni dei livelli di gioco.

Scopri di più...

 

Admin Countdown

Admin Countdown
Modulo per Joomla! 2.5 e 3.x visualizza nella parte di amministrazione del sito, un timer con il conto alla rovescia del tempo rimanente della tua sessione.

Scopri di più...  Demo

 

Da GROUP BY a OVER PARTITION


Sia data una tabella come la seguente, che descrive la struttura organizzativa di un'azienda.
I campi significativi per gli esempi di questo articolo sono i seguenti:

EMPNO:     il codice personale del lavoratore
ENAME:      il cognome del lavoratore
JOB:           la mansione del lavoratore
MGR:          il codice del responsabile del lavoratore
DEPTNO:   il codice del dipartimento del lavoratore


EMPNO   ENAME    JOB        MGR     HIREDATE     SAL    COMM    DEPTNO
-----   -----    ---        ----    ---------    ----   ----    ------
7369    SMITH    CLERK      7902    17-DIC-80    800            20
7499    ALLEN    SALESMAN   7698    20-FEB-81    1600    300    30
7521    WARD     SALESMAN   7698    22-FEB-81    1250    500    30
7566    JONES    MANAGER    7839    02-APR-81    2975           20
7654    MARTIN   SALESMAN   7698    28-SET-81    1250    1400   30
7698    BLAKE    MANAGER    7839    01-MAG-81    2850           30
7782    CLARK    MANAGER    7839    09-GIU-81    2450           10
7788    SCOTT    ANALYST    7566    19-APR-87    3000           20
7839    KING     PRESIDENT          17-NOV-81    5000           10
7844    TURNER   SALESMAN   7698    08-SET-81    1500    0      30
7876    ADAMS    CLERK      7788    23-MAG-87    1100           20
7900    JAMES    CLERK      7698    03-DIC-81    950            30
7902    FORD     ANALYST    7566    03-DIC-81    3000           20
7934    MILLER   CLERK      7782    23-GEN-82    1300           10



Supponiamo di volere rispondere alle seguenti domande:

1) quante righe  ci sono per ogni tipo di mansione?
2a) quante righe  ci sono per ogni dipartimento ?
2b) quante righe  ci sono per ogni coppia: mansione, dipartimento ?
2c) quante righe  ci sono per ogni tripla: mansione, dipartimento, responsabile  ?

Le queries che rispondono alle suddette domande (sia in MySql che in Oracle) sono le seguenti:

1)

SELECT job, COUNT(*) CNT
FROM emp
GROUP BY job;

2a)

SELECT job, deptno, COUNT(*) CNT 
FROM emp
GROUP BY job, deptno;

2b)

SELECT job, deptno, COUNT(*) CNT 
FROM emp
GROUP BY job, deptno;

2c)

SELECT job, mgr, deptno, COUNT(*) CNT
FROM emp
GROUP BY job, mgr, deptno;


Nelle suddette query viene eseguito un conteggio (COUNT(*)) ed un raggruppamento (GROUP BY),
rispetto  a due insiemi di campi: si noti che l'insieme dei campi elencati nella select deve essere
un sottoinsieme dell'insieme dei campi raggruppati dalla clausola GROUP BY.

Si noti inoltre che l'ordine in cui appaiono i campi raggruppati non é importante, così
al posto della query 2c) si può scrivere anche:


2c)

SELECT job, mgr, deptno, COUNT(*) CNT
FROM emp
GROUP BY deptno, job, mgr;



In sintesi, é un po' come se le query degli esempi suddetti "riducessero" tutte le righe della tabella,
raggruppandole appunto secondo i criteri specificati in ciascun caso.

Ora la domanda é: come si fa a ottenere la stessa informazione di conteggio e raggruppamento, ma senza ridurre
le righe?

In Oracle, questo é possibile con la clausola "COUNT(*) OVER (partition by ...)" .
Le query seguenti sono l'analogo delle query mostrate in precedenza, ma con il meccanismo di PARTITION al posto di GROUP BY.


1)
SELECT job, COUNT(*) OVER (partition by job) CNT
FROM emp;

2a)

SELECT deptno, COUNT(*) OVER (partition by deptno) CNT
FROM emp;


2b)

SELECT job, deptno, COUNT(*) OVER (partition by job, deptno) CNT
FROM emp;


2c)

SELECT job, mgr, deptno, COUNT(*) OVER (partition by job, mgr, deptno) CNT
FROM emp;



Il vantaggio di usare la clausola OVER é che in tal modo si può aggregare l'informazione senza usare la
clausola del raggruppamento, e ciò permette di mantenere, se necessario, tutte le righe della tabella.






CREDITS:
http://www.midnightdba.com/Jen/2010/10/tip-over-and-partition-by/


You have no rights to post comments

PHP Classes

IFile
by isApp.it

nominee
November 2013