SQL: come aggregare risultati diversi in un’unica riga di risultati

Come aggregare risultati diversi in un’unica riga (record) di risultati

Un amico ha sollevato questo problema: come conoscere con un’unica query quante foto ha inserito un dato utente nella tabella foto e quanti blog ha inserito lo stesso utente nella tabella blogs.

Dato che il database in uso era Access, non si potevano usare Stored Procedures, quindi il tutto andava fatto con un’unica query.

Procediamo quindi per passi successivi.

1. Per prima cosa vediamo come leggere quante foto sono state inserite (il nostro utente immaginario si chiamerà…. “Pippo”, come sempre)

SELECT COUNT(*) FROM gallerieFoto WHERE fAutore="Pippo"

il risultato della query sarà (ad esempio):
5

2. Adesso procediamo con la lettura di quanti messaggi sono stati inseriti nel blog

SELECT COUNT(*) FROM blogs WHERE bAutore="Pippo"

il risultato della query sarà (ad esempio):
3

3. Ora uniamo le due query con una UNION, visto che il formato di uscita è identico

SELECT COUNT(*) FROM gallerieFoto WHERE fAutore="Pippo"
UNION
SELECT COUNT(*) FROM blogs WHERE bAutore="Pippo"

il risultato della query sarà:
5
3

4. così facendo avremmo due record, ma non si vuole fare un ciclo di lettura; quindi bisogna fare in modo che la query restituisca 2 colonne, non due righe

5. iniziamo con l’attribuire i due nomi di colonna per i risultati: qFoto e qBlog

SELECT COUNT(*) AS qFoto FROM gallerieFoto WHERE fAutore="Pippo"
UNION
SELECT COUNT(*) AS qBlog FROM blogs WHERE bAutore="Pippo"

il risultato della query sarà:
5
3

6. però è ancora una colonna sola; quindi aggiungiamo una colonna per query che faccia da segnaposto: nella query delle foto aggiungiamo il segnaposto dei blog, nella query dei blog aggiungiamo il segnaposto delle foto

SELECT COUNT(*) AS qFoto, 0 AS qBlog FROM gallerieFoto WHERE fAutore="Pippo"
UNION
SELECT 0 as qFoto, COUNT(*) AS qBlog FROM blogs WHERE bAutore="Pippo"

da notare l’inserimento incrociato dei segnaposto, per ottenere la corrispondenza delle colonne

il risultato della query sarà:
5 0
0 3

7. sistemata la questione delle due colonne, resta il problema delle due righe; aggiungiamo una query esterna che raccolga i MAX delle query (infatti interessano i risultati 5 e 3, gli zeri vanno ignorati); potremmo usare anche SUM, io per abitudine preferisco MAX.

SELECT MAX(qFoto) AS qFoto, MAX(qBlog) as qBlog FROM (
SELECT COUNT(*) AS qFoto, 0 AS qBlog FROM gallerieFoto WHERE fAutore="Pippo"
UNION
SELECT 0 as qFoto, COUNT(*) AS qBlog FROM blogs WHERE bAutore="Pippo"
) AS subQry

il risultato della query sarà:
5 3

che è esattamente quello che si voleva ottenere.

Replica

%d blogger hanno fatto clic su Mi Piace per questo: