[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