Newsgroup: it.comp.appl.access
Titolo: come contare i valori diversi dentro un gruppo

ciao a tutti.
non riesco a risolvere un problema in access
ho 2 tabelle una con i dat ianagrafici  t1(nome cognome id_utente ecc.)
e la seconda con i timbri sul badge t2(id_timbro id_utente data ora
ecc)
siccome posso avere piu timbir lo stesso giorno per ogni utentente
vorrei poter raggruppare per utentente e poi metterci affinco quanti
timbri (con data diversa) ho
in pratica mi servirebbe fare una sorta di
select t1.nome,t1.cognome,count(distinct t2.data) from t1,t2 group by
t1.id_utente, t1.nome, t1.cognome
solo che facendo coun dstinct mi da errore
in realta la cosa è un po più complicata in quanto io passo anche
alla query 2 parametri che mi dicono fra quali date deve fare il
computo (esempio dal primo maggio al 15 maggio)
io ora faccio una cosa del genere:
SELECT (Select  Count (data) from (Select data from orario  group by
data)) AS numero_giorni, Sum(orario.ora2)-Sum(orario.ora1) AS
ore_lavorate, [nome]+" "+[cognome] AS anagrafica,
FROM dipendenti INNER JOIN orario ON
dipendenti.id_dipendente=orario.id_dipendente
WHERE (((orario.ora2)<>0) And
((orario.data)>Forms!maschera_riepilogo_ore!cerca_data_inizio And
(orario.data)<Forms!maschera_riepilogo_ore!cerca_data_fine))
GROUP BY [nome]+" "+[cognome], dipendenti.id_dipendente;
le ore vengono conteggiate giuste e messe affianco a ogni dipendente ma
il numero dei giorni che viene fuori è quello totale di duti i
dipendenti e nn del singolo
come posso fare?

 ha scritto nel messaggio 
news:1162567092.6...@b28g2000cwb.googlegroups.com...
ciao a tutti.
non riesco a risolvere un problema in access
ho 2 tabelle una con i dat ianagrafici  t1(nome cognome id_utente ecc.)
e la seconda con i timbri sul badge t2(id_timbro id_utente data ora
ecc)
................
SELECT (Select  Count (data) from (Select data from orario  group by
data)) AS numero_giorni, Sum(orario.ora2)-Sum(orario.ora1) AS
ore_lavorate, [nome]+" "+[cognome] AS anagrafica,
FROM dipendenti INNER JOIN orario ON
dipendenti.id_dipendente=orario.id_dipendente
WHERE (((orario.ora2)<>0) And
((orario.data)>Forms!maschera_riepilogo_ore!cerca_data_inizio And
(orario.data)<Forms!maschera_riepilogo_ore!cerca_data_fine))
GROUP BY [nome]+" "+[cognome], dipendenti.id_dipendente;
..........................
come posso fare?
Guarda, siccome non sono molto avanti con il linguaggio SQL (ho preferito sbrigare molte mie 
difficoltà direttamente con DAO, benedetta quella volta, no limits), un mio consiglio personale è di 
gestire il tutto creandoti una tabella per dati provvisori la quale riempirai con una funzione VBA 
ad hoc alla quale passerai tutti i parametri che vuoi.
oppure, cosa più semplice, creati pure la query, ma invece di calcolarti i totali direttamente da 
SQL, delega ad una funzioncina VBA questa piccola rottura di scatole, tanto le query di Access 
possono benissimo usare le funzioni che restituiscono valori idonei nel tipo. Magari la seconda 
soluzione sarà un pò lenta....
Ho sentito pure parlare di SubQuery, ma non ho mai approfondito. Troppo comodo DAO.
Michele

Se ho capito bene ti serve un risultato del tipo:
Nominativo	02/11/06	03/11/06	04/11/06
-----------------------------------------------------------------------------------------------
Mario Rossi	08:05		07:58		08:02
Carlo Bianchi			08:13		08:20
dove gli orari riportati rappresentano il totale delle ore di presenza nella data corrispondente a ciascuna colonna.
Se questo č ciň che vuoi ottenere, ti serve una query a campi incrociati.
Suppongo di avere le due tabelle seguenti:
Dipendenti
-----------------
ID		Contatore
Nome		Testo
Cognome	Testo
Timbrature
-----------------
CD_Dipendente	Numerico (Long)
Data		Data/Ora
OraI		Data/Ora
OraF		Data/Ora
La query seguente (che ho chiamato Orario) calcola per ogni dipendente e per ogni data di presenza, il totale delle ore:
SELECT Dipendenti.ID, Dipendenti.Nome, Dipendenti.Cognome, Timbrature.Data AS Giorno, Sum(nz([OraF],0)-nz([OraI],0)) AS
Presenza
FROM Timbrature RIGHT JOIN Dipendenti ON Timbrature.CD_Dipendente = Dipendenti.ID
GROUP BY Dipendenti.ID, Dipendenti.Nome, Dipendenti.Cognome, Timbrature.Data;
La query seguente (a campi incrociati) ha come origine dati la query Orario:
TRANSFORM First(Format$([Presenza],"Short Time")) AS Espr1
SELECT Orario.Cognome, Orario.Nome
FROM Orario
WHERE (((Orario.Giorno) Is Not Null))
GROUP BY Orario.ID, Orario.Cognome, Orario.Nome
ORDER BY Orario.Cognome, Orario.Nome
PIVOT Orario.Giorno;
e produce il risultato indicato all'inizio; ovviamente la clausola WHERE puň essere personalizzata per filtrare solo le
date che ti interessano.
HTH
Vincenzo Turturro
---------------------------------------------
il sito comune di it.comp.appl.access:
http://www.sitocomune.com/
---------------------------------------------
E quello di it.comp.as400
http://www.faq400.com/
---------------------------------------------