Newsgroup: it.comp.lang.visual-basic
Titolo: RecordCount senza doppi

E' possibile effettuare un conteggio dei records escludendo i "doppioni" ?
Qualcosa di diverso da quello che fa Having che invece li estrae...
Grazie
--
Gulp
....forse mi sono perso qualcosa !

 li estrae...
Select DISTINCT ...

 Qualcosa di diverso da quello che fa Having che invece li estrae...
SELECT COUNT(0) AS RecordCount FROM tabella GROUP BY campiNonDuplicabili
Ciao
--
Math Parser : 
http://www.neodatatype.net
Sito Comune : 
http://www.it-lang-vb.net


Forse mi sono spiegato male...o forse non ho capito.
Hho nel campo numero fattura, per necessità che non sto a spiegare la
fattura numero n (es. 13) che compare cinque sei volte, ma poi per motivi di
conteggio devo contare quante fatture sono state emesse ed ecco che il
numero potrebbe risultare sfalsato.... emm tutto sto casino per non creare
due tabelle di db che, forse, avrebbero una minor ridondanza di dati... ci
sto pensando.


> Select DISTINCT ...
OK provo Distinct


 
In sqlserver e access :
select count(*) FROM (select  distinct campo1   from tabella) as tmp }
ciao
	maxx
-- 
NOSPAM: Rimuovere i trattini dallo username!
Cut hyphens from my username!

 select count(*) FROM (select  distinct campo1   from tabella) as tmp }
Ehm... perchè io ho una nota che dice "non va per Sql Server"?
Bevevo?

Il 11/01/2004 17.31, Lupo scrisse:

Ho appena provato. Forse in qualche versione precedente non era prevista 
questa sintassi ...


 prevista questa sintassi ...
Ho appena provato anch'io (ESP0DAMA, ADO 2.7 e SQL Server 7 SP4).
Pur correggendo in :
select count(*) FROM (select  distinct campo1 from tabella)
o anche in
select count(*) as pippo FROM (select  distinct campo1 from tabella)
Mi dice errore di sintassi.
Con le stesse modalità con ADO e Access, funziona.

Il 11/01/2004 17.37, Lupo scrisse:

E' interessante il fatto che la sintassi SQL non dipenda dal database 
stesso ma dal provider di accesso. :-(
Dal momento che con DAO questa banale query non si puo' fare sei 
costretto a passare as ADO!
;-)


 maxx
E adesso chi ti salva da un colpo di bazooka ? Abbassati ! Abbassati......


> select count(*) FROM (select  distinct campo1   from tabella) as tmp }
Questa è comoda come sintassi SQL... Scusate se mi intrometto, ma si può
fare anche con Access?
Antonio Mirarchi

 costretto a passare as ADO!
No, no, tranquillo, DAO la ciuccia piů che bene ( e, naturalmente, piů
velocemente :-P )
Qui, IMHO, il responsabile č solo il mio Sql Server, nemmeno ADO, direi. ;-)

 
Piu' che il bazooka mi spaventano le zanne!
:-)


datFattureRS.RecordSource = "select distinct FTN, *  from fatture Where
Year(CONDATA) =" & passanno & ""
datFattureRS.Refresh
Non funziona....


> select count(*) as numero FROM (select  distinct campo1   from tabella)

 
Nella riga sopra a quella che hai quotato c'era scritto:
in sqlserver e access!
Un po' di attenzione, per favore! :-)


 Non funziona....
Vedi altri post (io sono stato troppo "abbreviato")
Select count(*) As Numero_Fatture_Diverse From (Select distinct FTN from
fatture Where ...)

 
Se non ricordo male in sqlserver 7 quella sintassi era vietata ...


 Se non ricordo male in sqlserver 7 quella sintassi era vietata ...
"Vietata", come sei diplomatico. Si dice non gestita o gestita male. ;-)

 from fatture Where ...)
A parte il count per visualizzare i records senza doppioni in dBgrid:
datFattureRS.RecordSource = "select * from (select distinct FTN from fatture
Where Year(CONDATA) =" & passanno & ")"
Da: "Sintax error in FORM clause"
Dov'è sbagliata ?


 Dov'è sbagliata ?
E' sbagliato il concetto: Qui, se ho ben capito, vuoi visualizzare i record
diversi:
Select Distinct vari_campi_diversi from tabella
Oppure (ma è altra cosa):
Select vari_campi from tabella Group by campi_di_raggruppamento

 
Ho guardato adesso il manuale di sqlserver 7 e le derived tables 
dovrebbero essere permesse:
"One or more derived tables, which are SELECT statements in the FROM 
clause referred to by an alias or a user-specified name. The result set 
of the SELECT in the FROM clause forms a table used by the outer SELECT 
statement. For example, this SELECT uses a derived table to find if any 
store carries all book titles in the pubs database:
SELECT ST.stor_id, ST.stor_name
FROM stores AS ST,
      (SELECT stor_id, COUNT(DISTINCT title_id) AS title_count
       FROM sales
       GROUP BY stor_id
      ) AS SA
WHERE ST.stor_id = SA.stor_id
   AND SA.title_count = (SELECT COUNT(*) FROM titles)
"
Sui NG ho letto che le derived tables devono essere aliased, quindi se 
provi a scriverla come:
select count(*) from (select distinct campo from tabella )as tmp 
dovrebbe funzionare ...


 dovrebbe funzionare ...
Sì! Avevo tolto quel As tmp finale per non "sporcare" la sintassi. Ora
capisco che il discorso è invece concettuale. Grazie

 Non funziona....
Ma nessuno ha visto il mio post?
Sicuramente più veloce di una SELECT annidata (lenta per definizione)
compatibile con SQLserver (a parte l'AS per l'alias), Access, Paradox, e
altri, funziona con ADO, DAO, ODBC...
Bah... UCAS


  
Tutto e' bene cio' che finisce bene! Gulp
:-)


 Che funziona?
Sto provando....ma mi sembra di no... sbaglio qualcosa.
Non inorridire... il codice, prima che mi ponessi il problema del DISTINCT,
era relativo alla visualizzazione e al conteggio ed era così:
datFattureRS.RecordSource = "select * from fatture Where Year(CONDATA) =" &
passanno & ")"
datFattureRS.Refresh
e di questo dovrei fare il distinct per la visualizzazione
Invece per
If datFattureRS.Recordset.EOF = True And datFattureRS.Recordset.BOF = True
Then
numerofatture = datFattureRS.Recordset.RecordCount
ho messo
datFattureRS.RecordSource = "Select count(*) As numerofatture From (Select
distinct FTN from fatture Where Year(CONDATA) =" & passanno & ")"
datFattureRS.Refresh
Che non da errore,ma non fa niente


 
Il problema e' che la tua query non fa cio' che serve a gulp.
Supponi di avere in un sacco 10 palline blu, 5 rosse e 3 verdi.
La tua query ci restituisce 10, 5, 3.
Invece gulp vuole sapere quanti tipi di palline ci sono nel sacco?
E la risposta e' 3 e la si ottine con la mia query, tie'! :-)



Per quanto riguarda me...(poi i post si sono incanalati in  una direzione
che per quanto mi riguarda dire "arabo" è lo stesso)
ho sbagliato a cliccare la risposta ed ho postato "sotto" a Lupo anzichè sul
NG.
Scusami.
Ciao


 
Prova a scriverla cosi':
"Select count(*) As numerofatture From (Select
distinct FTN from fatture Where Year(CONDATA) =" & passanno & ") AS tmp"


 La tua query ci restituisce 10, 5, 3.
Poi un giorno ci studieremo pure l'SQL ;)
Se fai la group by sul campo colore ottieni 3, dato che la count serve
proprio a questo.


 tmp"
Sono in prova: ho emesso in tutto 5 fatture 1, 2 ,3, 4, 4 <---(doppia)
conteggio fatture con la tua query= 5


 Poi un giorno ci studieremo pure l'SQL ;)
Cancella tutto, vado a ripassarmi SQL e grammatica italiana ;)


 
Ti consiglio di fare una prova ...
count() con group by restituisce 3 righe con 10, 5 e 3
E che io sappia e' sempre stato cosi' ...
Puo' essere che con database diversi da sqlserver e access funzioni come 
suggerisci tu, ma al momento non ho sottomano altri db per fare una prova.



Sì, mi ero già fustigato da solo prima del tuo post ;)
In effetti credo che la soluzione migliore sia
SELECT count(0) from (select 0 FROM palline group by colore)
Però voglio fare ancora due prove


 
Mi sembra improbabile.
La seconda query ti restituisce 4 record (verificalo e se te ne 
restituisce di piu' c'e' qualche altro problema). Se a questo punto 
esegui un count() sulla "tabella" risultante non puoi ottenere 5.
Quindi procedi per passi successivi:
prendi questa
Select distinct FTN from fatture Where Year(CONDATA) =" & passanno & "
e vedi quanti record ottieni.
Poi fai una prova con la "mia".


 
in sql server la tua funziona solo cosi':
SELECT count(0) from (select 0 as campo  FROM palline group by colore) 
as tabella


 as tabella
E in access credo che le select annidate funzionino solo dal 2000 in su.
Eventualmente poteva usare la mia prima select per aprire un recordset e
guardare il recordcount di questo, quindi la risposta era solo incompleta e
non errata ;)


 E in access credo che le select annidate funzionino solo dal 2000 in
Ecco perchè da me non funziona!


 Ecco perchè da me non funziona!
:) Allora l'unica buona rimane la mia come descritto prima :PPP


 
Ho appena provato su un db access 97 e la mia funziona.
Quella di zanna funziona al modo di zanna ... :-)


 Quella di zanna funziona al modo di zanna ... :-)
Riformulo la "sentence".
Le select annidate funzionano con jet4 (dao3.6) ma non con il vecchio jet3.5
(dao3.51), quindi un mdb 97 aperto con DAO 3.6 o con access2000 esegue
select annidate.
Lo stesso mdb, aperto con DAO 3.51 o con access97 no (3131: Syntax error in
FROM clausole).


In Access con Dao 3.6
datFattureRS.RecordSource = "Select count(*) from fatture Where
Year(CONDATA) =" & passanno & " group by FATN"
e
datFattureRS.RecordSource = "Select distinct FATN from fatture Where
Year(CONDATA) =" & passanno & ""
Funzionano entrambe
Quindi grazie ad entrambi.....e anche a Lupo
Ma qui bisogna star attenti perchè quando si chiede qualcosa bisogna
considerare che ci possono essere
dei conti in sospeso.....oppure si scatena il casino !   :-))    ;-)
Ciao


 
Non conti in sospeso, ma una sana rivalita' ed uno spirito competitivo, 
ma anche collaborativo.
Adesso sappiamo tutti che le derived tables non funzionano con dao 3.51 
e zanna sa come si contano le palline in un sacchetto! :-P
ciao



Le SubSelect funzionano anche con DAO2.0 cambia solo la sintassi delle
parentesi.
---------------------------------------
SELECT Count(1) AS Conteggio
FROM [SELECT DISTINCT CAMPO1 FROM Tabella1]. AS x;
---------------------------------------
Comunque con SqlServer esiste anche il COUNT(DISTINCT Campo)
Ciao Giorgio

Il 12/01/2004 0.16, Giorgio Prx scrisse:

All'unanimita' (perche' probabilmente ormai sono rimasto solo io) sei 
dichiarato vincitore del thread!
:-)
ciao


 dichiarato vincitore del thread!
MaQuandoMai! ;-)

 
Non e' che lavoriamo troppo? :-(


 Non e' che lavoriamo troppo? :-(
Tu stai lavorando? :-)

 
Lasciamo perdere o sparo alla tastiera. :-(
ciao


 dei conti in sospeso.....oppure si scatena il casino !   :-))    ;-)
None, si tratta di essere il più possibile chiari per avere, se possibile,
risposte altrettanto chiare.
In questo caso m'è parso che un secondo problema sia stato mischiato al
primo. Sbaglio?

 Purtroppo e' cosi' poco standard che si tende a rimuoverla.
Vero, non lo sapevo. In ogni caso, pur non trasformando i database da 97 a
2000, io includo sempre e solo DAO 3.6, non più 3.51 e non vedo motivo per
non farlo. Comunque, vero, l'ho scoperto anch'io solo ora.
A proposito, c'entra poco, ma la mia versione di ESP0DAMA va in errore
(maledette proprietà JETOLEDB di ADO) aprendo un database Access 97 con ADO
+ Jet 3.51. Ci guardo domani...

 A me pareva la prima.
Saro' un po' rincoglionito, ma ho appena riprovato e in sqlserver quelle 
2 query restituiscono lo stesso tipo di risultato (nella seconda si deve 
aggiungere un group by alla fine altrimenti sqlserver si lamenta).
la prima restituisce n record dove n e' il numero di fatture distinte 
con un solo campo contenente il numero di fatture pe run certo numero di 
fattura.
La seconda restitutisce l'elenco senza duplicati dei numeri di fattura.
Da uno degli esempi fatti da Gulp nessuna delle 2 e' quella cercata ...
E mi fermo qui.


 schizoide.
Non c'č nulla di strano nella vecchia sintassi ed č perfettamente coerente
con la sintassi dei database esterni.
------------------------------------------------
SELECT cod
FROM   [C:\Documenti\Db\1.mdb].prova_1
------------------------------------------------
bisogna tener conto che ormai sono passati piů di 10 anni, poi
nell'evoluzione di Jet si sono avvicinati sempre piů a SQL92 anche se ancora
mancano la CROSS JOIN e la FULL JOIN (bisogna farle ancora all'antica)
Buona notte
Giorgio

 e zanna sa come si contano le palline in un sacchetto! :-P
Non le palline, ma il numero dei colori delle palline ;)
Non mi sbaglierai i problemi anche tu adesso! :)
Ciao

 ------------------------------------------------
Io per questi li ho sempre usati senza quadre (non ricordo se 
C:\Documenti\Db\1.mdb.prova_1 o "C:\Documenti\Db\1.mdb].prova_1") e 
funziona comunque.
Che abbia una logica sono perň d'accordo: se le quadre definiscono una 
tabella (o meglio una vista), che altro č [select * from tabella] se non 
una vista?
Ciao

 
Io di solito conto i calzini. In un sacchetto ci sono 5 calzini neri e 5 
calzini bianchi. Quanti calzini bisogna estrarre per essere sicuri di 
avere 2 calzini uguali? E per avere 2 calzini bianchi?


 E per avere 2 calzini bianchi?
n = (numero dei calzini <> bianchi) + 2
Ma che c'entrano i calzini? ;)
Ciao

 Ma che c'entrano i calzini? ;)
Ero  stanco di palline colorate. :-)


 e tutto quello che fa lui e' sbagliato ...
No, ma dato che accetta una sintassi standard e una no, mi pare stupido 
scegliere la non standard.
Sul fatto che poi * equivale a "tutto il record" continuo a non essere 
d'accordo, ma come detto ci rinuncio.
Mi convincerai quando potrò fare DELETE campo FROM tabella e questo mi 
cancellerà solo il campo indicato anzichè l'intero record come fa oggi 
(quindi secondo la tua teoria anche "campo" equivale a "tutto il 
record", ancora come se si potesse eliminare solo "un po' di record").
:)
Ciao

 
Non mi passa nemmeno per l'anticamera del cervello di convincerti di un 
orrore del genere...
Io non volevo convincerti che * equivale a tutto il record, stavo solo 
cercando di dare un'interpretazione al fatto che in access si possa 
scrivere "delete *".
Su count(*) invece ribadisco la mia posizione perche' in questo caso 
count(0) proprio non mi piace. Count conta i record non il campo 0 ed in 
questo caso count(*) e' piu' espressiva.
Vabbe, basta sqlfilofia.


 questo caso count(*) e' piu' espressiva.
Count(0) era un'abbreviazione.
Il sistema corretto sarebbe
SELECT COUNT(colori) FROM (SELECT COUNT(colore) AS colori FROM palline GROUP
BY colore)
Una curiosità: questa query, salvata anche in Access2000 viene riaperta come
SELECT COUNT(colori)
FROM [SELECT COUNT(colore) AS colori FROM palline GROUP BY colore]. AS
[%$##@_Alias];
Ciao

 
Avranno dimenticato di aggiornare qualche libreria dopo l'introduzione 
delle derived tables con notazione standard ...


 delle derived tables con notazione standard ...
Secondo me sono più confusi i programmatori degli utenti ;)
D'altra parte, quante volte ti viene fatta una domanda sul tuo programma e
tu rispondi che devi "guardare il codice" per ricordarti? (La documentazione
non si sa nemmeno cosa sia e comunque non è mai aggiornata)
