[Db] incartato col count

Marcello Vezzelli marcello a vezz.it
Lun 18 Dic 2006 15:24:17 CET


Cristiano Verondini ha scritto:
>>
>> E' sensato? C'è modo di far meglio senza la JOIN ?
>
>    Stai parlando di una UNION e ti è venuto scritto JOIN, vero? :)

Ammetto che sono imbambito, ma non riesco a farla funzionare con la
UNION mentre con la JOIN si.

Nella realtà dei fatti a me interessano sostanzialmente solo le pere (e
i doppi sensi si sprecano :D).
Quindi metto un where frutto='pera' dove vado a contare le pere, ma
continuo a contare tutti i frutti nella seconda parte della query.
(no, 'pera' non è un campo indicizzato, nel senso che potrebbe essere
qualsiasi parola... è un campo aperto inserito dall'utente).
Ho tolto gli ORDER BY delle SELECT e ne ho messo uno nella JOIN.
Ho aggiunto anche la percentuale di pere rispetto al totale.

Faccio un riepiloghino...
ho una tabella così composta:

CREATE TABLE `frutta` (
`id` INT NOT NULL AUTO_INCREMENT ,
`frutto` VARCHAR( 100 ) NOT NULL ,
`data` DATE NOT NULL ,
PRIMARY KEY ( `id` )
) TYPE = innodb;

dentro ho nomi di frutti e date di raccolta.
Voglio una tabella che mi riporti relativamente alle "pere", un record
per ogni mese:
- mese di raccolta
- totale frutti raccolti in quel mese
- totale pere raccolte in quel mese
- percentuale delle "pere" rispetto al totale

Questa è la query costruita con pesante contributo della ml :D

SELECT T1.DT2,
T2.TOT,
T1.C,
T1.C/T2.TOT*100 AS PERC
FROM (
    SELECT COUNT( frutto) AS C,
    DATE_FORMAT(data,'%Y %m') AS DT,
    DATE_FORMAT(data, '%m-%Y') AS DT2,
    frutto
    FROM frutta
    WHERE frutto='pera'
    GROUP BY DT, pera
)  AS T1
JOIN (
    SELECT DATE_FORMAT( data, '%Y %m' ) AS DT,
    COUNT( * ) AS TOT
    FROM frutta
    GROUP BY DT
) AS T2
ON T1.DT=T2.DT
ORDER BY T1.DT,T1.C DESC

Adesso vorrei capire però il modo MIGLIORE per farlo :)

Qualche dritta?

Ciao
Marcello



Maggiori informazioni sulla lista Db