Funzione count...

lunedì 29 gennaio 2007 - 13.32

beppenike Profilo | Newbie

ho una tabella con dei colori e ad ogni colore c'è associata una data.
es
COLORE | DATA
Rosso 01/01/2006
verde 01/03/2006
Rosso 01/03/2006
verde 01/01/2006
Rosso 01/03/2006
giallo 01/01/2006
Rosso 01/02/2006
Rosso 01/03/2006
giallo 01/03/2006
Rosso 01/01/2006

ho fatto una query dove mi conta quante volte compare il colore rosso nel mese di gennaio, febbraio e marzo, quindi ho fatto cosi

SELECT Count(*) as presenze
from tabella1
WHERE (tabella.COLORE like '*Rosso*') AND (tabella.DATA like '*/01/2006');
UNION SELECT Count(*) as presenze
from tabella1
WHERE (tabella.COLORE like '*Rosso*') AND (tabella.DATA like '*/02/2006');
UNION SELECT Count(*) as presenze
from tabella1
WHERE (tabella.COLORE like '*Rosso*') AND (tabella.DATA like '*/03/2006');

la lista che mi dovrebbe restituire dovrebbe essere la seguente

|presenze|
2
1
3
mi chiedo perchè una volta avviata la query me la ordina in ordine crescente? cioè

|presenze|
1
2
3

cosa ho sbagliato?

tnx

ps database access 2003

alx_81 Profilo | Guru

>ho una tabella con dei colori e ad ogni colore c'è associata
>una data.
>ho fatto una query dove mi conta quante volte compare il colore
>rosso nel mese di gennaio, febbraio e marzo, quindi ho fatto
>cosi
>
>SELECT Count(*) as presenze
>from tabella1
>WHERE (tabella.COLORE like '*Rosso*') AND (tabella.DATA like
>'*/01/2006');
>UNION SELECT Count(*) as presenze
>from tabella1
>WHERE (tabella.COLORE like '*Rosso*') AND (tabella.DATA like
>'*/02/2006');
>UNION SELECT Count(*) as presenze
>from tabella1
>WHERE (tabella.COLORE like '*Rosso*') AND (tabella.DATA like
>'*/03/2006');

Questa non è la miglior via per ottenere quello che vuoi. Innanzitutto, non capisco perchè utilizzi l'operatore LIKE, visto che per integrità del dato, l'informazione colore dovrebbe essere uniforme.
In secondo luogo, sarebbe meglio normalizzare la struttura, magari facendo una tabella colori, composta da un IDColore ed una DescrizioneColore. In questo modo eviteresti l'eccessiva ridondanza dei dati.
Detto questo la query con union non è quella che mi sento di consigliarti.. Prova a dare un occhoi a questo SQL:

SELECT COUNT(*),MONTH(data) AS Mese FROM tabella1 GROUP BY MONTH(data)

in poche parole raggruppo i dati per mese e li conto.. se ti servono solo dei primi 3 mesi, basta aggiungere una Having dopo il GROUP BY, come segue:

SELECT COUNT(*),MONTH(data) AS Mese FROM tabella1 GROUP BY MONTH(data) HAVING MONTH(data) <= 3

>mi chiedo perchè una volta avviata la query me la ordina in ordine
>crescente? cioè
>
>|presenze|
>1
>2
>3

Union ordina e rimuove i duplicati..
>
>tnx
di nulla!

Alx81 =)

http://blogs.dotnethell.it/suxstellino

beppenike Profilo | Newbie

sei un grande, funziona mooolto bene ed il codice è piu snello

un ultima cosa, come posso inserire piu risultati di 3 query uguali sullo stesso report ?
io ho pensato a dei sottoreport... conosci altro?

stupiscimi

alx_81 Profilo | Guru

>sei un grande, funziona mooolto bene ed il codice è piu snello
>
eheheh addirittura.. accetta la risposta (se lo ritieni opportuno) ed apri il thread nuovo con la nuova domanda..
>
>un ultima cosa, come posso inserire piu risultati di 3 query
>uguali sullo stesso report ?
>io ho pensato a dei sottoreport... conosci altro?
Purtroppo non credo si possa fare altrimenti.. ma non sono un esperto di access..
quindi ti consiglio di postare la domanda in un nuovo thread, magari qualcuno più esperto può darti una mano..

ciao!

Alx81 =)

http://blogs.dotnethell.it/suxstellino

beppenike Profilo | Newbie

allora, come funzione proposta dal nostro amico è buona, ma c'è un piccolo problema, e cioè, quando nn trova nessun colore anzichè darmi come valore "0" non mi da nulla :O
si puo' risolvere questo problema?

tnx anticipatamente

alx_81 Profilo | Guru

>allora, come funzione proposta dal nostro amico è buona, ma
>c'è un piccolo problema, e cioè, quando nn trova nessun colore
>anzichè darmi come valore "0" non mi da nulla :O
>si puo' risolvere questo problema?

è un normalissimo problema.. perchè non è che la count(*) non torna 0, è che la query non ritorna nulla, nessuna riga.. quindi non può contare raggruppando per un mese che non esiste..

Se vuoi ottenere un conteggio del tipo:

mese conteggio
1 10
2 5
3 3
4 0
5 0
... ...
12 3

devi farti una tabella dei mesi (o dei periodi) e poi metterla in join (left o right in base a come scrivi la query) con la tabella dei colori..

SELECT COUNT(C.Colore), M.mese
FROM Mesi M
LEFT JOIN Tabella1 C
ON MONTH(C.data) = M.mese
GROUP BY M.mese

in questo modo, anche non avendo colori, vedi 0 in posizione "mese"..

>
>tnx anticipatamente
di nulla!

Alx81 =)

http://blogs.dotnethell.it/suxstellino
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5