Contare i record scartando eventuali "doppioni".

di il
20 risposte

Contare i record scartando eventuali "doppioni".

Ciao a tutti e ben ritrovati.

Come forse qualcuno ricorderà, ho creato un DB per l'archiviazione di tutte le edizioni di opere liriche che ho e, prima di terminare il data entry, sto preparando vari report per avere "notizie" sui dati inseriti: da quelli più generali (numero di edizioni presenti, lista dei cantanti, ecc.), a quelli un po' più di dettaglio, tra cui, ad esempio, la lista dei 10 tenori con più presenze nell'archivio.

I dati sono raccolti in due tabelle, TabEdizioni e TabInterpretazioni: la prima raccoglie tutte le informazioni relative all'edizione (compositore, titolo, direttore, orchestra, ecc.), mentre nella seconda inserisco, per ogni edizione, tutti i cantanti che interpretano quell'opera. Entrambe le tabelle, naturalmente, sono costituite da record i cui campi sono numeri, corrispondenti agli ID dei vari campi.

Ci sono delle edizioni in cui un cantante interpreta più di un ruolo: si tratta quasi sempre di personaggi minori, ma sarebbe fuorviante contare, per quella edizione, una presenza doppia (se non tripla) di quel dato cantante, anziché singola. Per chiarire: se il cantante con ID=7 è presente in 9 opere in cui interpreta un solo ruolo e in una decima opera in cui interpreta due ruoli, il totale delle sue presenze in archivio deve essere 10 e non 11.

Il problema che non riesco a risolvere è proprio quello di contare l'IDInterprete nella TabInterpretazioni, scartando la eventuale presenza "multipla" del cantante in una certa edizione e, quindi, di far comparire il numero esatto nel report. Il conteggio lo eseguo con una query e ho lavorato su questa per trovare una soluzione: sono però arrivato alla conclusione che in questo modo non arriverò a nulla, perché ogni raggruppamento sui campi mi preclude la possibilità di scartare il doppione; ho provato anche con dei campi calcolati, concatenando edizione e interprete per vedere dove ci sono presenze multiple, ma inutilmente.

Ho pensato, quindi, di ricorrere ad una tabella in cui raccolgo i dati in modo da tenere conto delle presenze multiple. Prima di procedere vi chiedo se è la strada giusta, o se è meglio lavorare sulla query perché mi sfugge qualcosa (essendo un principiante). Cosa mi suggerite?

20 Risposte

  • Re: Contare i record scartando eventuali "doppioni".

    Non conosciamo i nomi esatti di tutti i campi coinvolti, ma credo che devi fare il Raggruppamento sulla coppia campi IDInterprete e IDEdizione. Se proprio non funziona così:
    1. Crea una "query ricerca duplicati" sulla coppia campi che ho detto
    2. Vai in visualizzazione struttura e troverai un campo su cui c'è scritto >1. Elimina >1
    3. Salva la query
  • Re: Contare i record scartando eventuali "doppioni".

    Ciao Osvaldo, grazie.
    In effetti avevo provato come hai suggerito: seleziono solo IDInterprete e IDEdizione e raggruppo; in questo modo non conto due volte un interprete che abbia due ruoli in una edizione. Ma il conteggio delle presenze di ciascun interprete su quale campo lo eseguo?
  • Re: Contare i record scartando eventuali "doppioni".

    Donizetti ha scritto:


    Ma il conteggio delle presenze di ciascun interprete su quale campo lo eseguo?
    Mi prendi in castagna su un terreno a me poco congeniale. In casi come questo io stesso preferisco creare la "query ricerca duplicati" sfruttando la procedura guidata. Nella procedura guidata devi indicare che vuoi conoscere i duplicati su 2 campi...poi modifichi quel >1 che ti ho detto, altrimenti ti esclude i casi "singoli".

    P.S.: Ti consiglio vivamente la procedura guidata, in quanto la visualizzazione struttura presenta una configurazione su molti campi ripetuti e "ridenominati". Ho rifatto un mio test e funziona.
  • Re: Contare i record scartando eventuali "doppioni".

    Certo che con quel nickname... cantanti... opere varie... non potevi che realizzare un database per quelle cose (ops... chissà cosa pensi adesso con il mio nickname). Fine delle mie solite battute che fan ridere solo me.

    Donizetti ha scritto:


    ...
    Ci sono delle edizioni in cui un cantante interpreta più di un ruolo: si tratta quasi sempre di personaggi minori, ma sarebbe fuorviante contare, per quella edizione, una presenza doppia (se non tripla) di quel dato cantante, anziché singola.
    Sicuro sicuro sicuro che non ci sono e non ci saranno eccezioni a questa regola? Che posta in un altro modo la domanda diventa: è solo fuorviante, può diventarlo, o è proprio sbagliato contare, per quella edizione, una presenza doppia (se non tripla) di quel dato cantante, anziché singola?
    Perché se in futuro ti interessasse considerare la presenza di un artista più di una volta in una determinata edizione dovresti metter mano a tutto il meccanismo, andando poi ad integrare il tuo database con un'informazione che ti dica quando considerare (o ignorare) la presenza multipla (la chiamo così) oppure, addirittura, a considerare su 3 ruoli interpretati 2 sì e 1 no. Su queste cose l'esperto di "catalogazione di opere" è Osvaldo, io parlo solo in linea di principio (anche se a volte, quando facevo 2 o più personaggi a teatro, considerarmi 1 sola volta non mi sarebbe andato giù tanto... minori finché vuoi ma hai un lavoraccio di cambi da paura, in tempi ovviamente umanamente impossibili. Ma tanto quello è il passato)
    Bon, detto questo, e una volta che c'hai pensato, il problema "non si pone". E' ovvio che nel momento in cui fai il conteggio delle "presenze" devi considerare solo i campi che sono veramente importanti, non buttarci dentro di tutto, men che meno la chiave primaria.
    Esempio di query che non considera la doppia presenza in una edizione
    SELECT IDInterprete, IDEdizione, Count(IDInterprete) AS ContaPresenze FROM TabEdizioni GROUP BY IDInterprete, IDEdizione
    Sicuro che due tabelle siano sufficienti? TabEdizioni e TabInterpretazioni. Non so cosa contiene ognuna di esse ma vedrei bene almeno anche una tabella contenente solo il nome dell'artista (quella che in un db generale raccoglie le anagrafiche dei soggetti). Perché se il database è strutturato male allora fare quel tipo di conteggi diventa sempre più complicato e poi impossibile. Ma su questo, tra i due finora intervenuti in questo thread oltre a te, l'esperto è Osvaldo.
  • Re: Contare i record scartando eventuali "doppioni".

    Secondo me la strutturazione tabelle/campi descritta è corretta, ci può stare. Da quello che ho capito io, la relazione è TabEdizioni uno-a-molti TabInterpretazioni. Nella query non serve nemmeno prendere in considerazione TabEdizioni, ma puntare solo sui campi TabInterpretazioni.IDInterprete e TabInterpretazioni.IDEdizione (quest'ultimo la chiave esterna).
  • Re: Contare i record scartando eventuali "doppioni".

    Queste sono le tabelle e le relazioni del DB progettato.

    Archivio_musicale_ver1_Relazioni.JPG
    Archivio_musicale_ver1_Relazioni.JPG

    Le opere in cui ci sono cantanti che ricoprono più ruoli (in genere due) sono quasi sempre registrate, quindi nessun cambio di costumi e stress... In casi particolari, in opere particolarmente lunghe e con moltissimi personaggi (per esempio, in quelle di Monteverdi) anche dal vivo qualche cantante ricopre due e financo tre ruoli.

    Contare questi interpreti una sola volta, lungi dall'essere una diminutio, significa, per me, sapere in quante edizioni dell'archivio compaiono senza preoccuparsi se cantano più ruoli. Ho in mente di fare un conteggio analogo per gli interpreti: dato un interprete, lista dei personaggi interpretati e quante volte.
  • Re: Contare i record scartando eventuali "doppioni".

    Ci ho visto giusto allora, fai come ti ho suggerito, solo sulla TabInterpretazioni.
  • Re: Contare i record scartando eventuali "doppioni".

    OsvaldoLaviosa ha scritto:


    Non conosciamo i nomi esatti di tutti i campi coinvolti, ma credo che devi fare il Raggruppamento sulla coppia campi IDInterprete e IDEdizione. Se proprio non funziona così:
    1. Crea una "query ricerca duplicati" sulla coppia campi che ho detto
    2. Vai in visualizzazione struttura e troverai un campo su cui c'è scritto >1. Elimina >1
    3. Salva la query
    Fatto: così conto i duplicati per tutti i cantanti. Ora dovrei separare i vari tipi di voce...

    Se inserisco IDVoce=4 (Tenore), va a contare i duplicati della coppia IDEdizione-IDInterprete in funzione di IDVoce=4, e non è ciò che mi occorre.
  • Re: Contare i record scartando eventuali "doppioni".

    Non ti seguo più, elenca un recordset di valori per farmi capire meglio cosa vuoi dire.
  • Re: Contare i record scartando eventuali "doppioni".

    OsvaldoLaviosa ha scritto:


    Non ti seguo più, elenca un recordset di valori per farmi capire meglio cosa vuoi dire.
    La tabella TabInterpretazioni è del tipo:
    IDEdizione IDInterprete IDPersonaggio IDVoce
    ------------------------------------------------------------
    1 119 456 5
    1 345 457 1
    1 589 458 4
    1 119 459 5
    .....
    977 119 241 5
    977 1329 242 2
    ecc.

    Fai conto che al momento TabInterpretazioni ha circa 8500 record; io vorrei estrarre i 10 baritoni (IDVoce=5) con più presenze, senza contare le eventuali presenze multiple nella stessa edizione. Nell'esempio, il baritono con ID=119 compare 3 volte nella colonna IDInterprete, ma due di queste si riferiscono alla stessa edizione (IDEdizione=1), dove interpreta due personaggi (456 e 459): il conteggio mi dovrà restituire 2 e non 3.
  • Re: Contare i record scartando eventuali "doppioni".

    Questa è una possibile soluzione
    Soluzione.jpg
    Soluzione.jpg

    dove:
  • Re: Contare i record scartando eventuali "doppioni".

    Donizetti ha scritto:


    La tabella TabInterpretazioni è del tipo:
    IDEdizione IDInterprete IDPersonaggio IDVoce
    ------------------------------------------------------------
    1 119 456 5
    1 345 457 1
    1 589 458 4
    1 119 459 5
    .....
    977 119 241 5
    977 1329 242 2
    ecc.

    Fai conto che al momento TabInterpretazioni ha circa 8500 record; io vorrei estrarre i 10 baritoni (IDVoce=5) con più presenze, senza contare le eventuali presenze multiple nella stessa edizione. Nell'esempio, il baritono con ID=119 compare 3 volte nella colonna IDInterprete, ma due di queste si riferiscono alla stessa edizione (IDEdizione=1), dove interpreta due personaggi (456 e 459): il conteggio mi dovrà restituire 2 e non 3.
    Fai lo stesso procedimento di "query ricerca duplicati" con procedura guidata, indicando che vuoi sapere i duplicati su 3 campi: IDEdizione, IDInterprete, IDVoce.

    Ah, aspetta, forse ho capito. Effettivamente nella colonna Conteggio apparirà 2 per IDEdizione=1 e 1 per IDEdizione=977. Ma io dico che la colonna Conteggio non la devi considerare più...e a questo punto il "Conteggio" lo fai sui RECORD restituiti relativi a Raggruppamento.
  • Re: Contare i record scartando eventuali "doppioni".

    Msaccess non supporta il count (distinct ...)
    ma può essere simulato come segue
    
    select count(q.*) 
    from
     ( select distinct idedizione, idInterprete from tabInterpretazioni) as q
    
  • Re: Contare i record scartando eventuali "doppioni".

    OsvaldoLaviosa ha scritto:


    Fai lo stesso procedimento di "query ricerca duplicati" con procedura guidata, indicando che vuoi sapere i duplicati su 3 campi: IDEdizione, IDInterprete, IDVoce.

    Ah, aspetta, forse ho capito. Effettivamente nella colonna Conteggio apparirà 2 per IDEdizione=1 e 1 per IDEdizione=977. Ma io dico che la colonna Conteggio non la devi considerare più...e a questo punto il "Conteggio" lo fai sui RECORD restituiti relativi a Raggruppamento.
    Ho provato, ma, se ho ben capito, il tuo metodo mi consente di contare le presenze solo per i duplicati.

    Ho applicato il tuo suggerimento ad un sottoinsieme di interpreti, per verificare più rapidamente la congruenza del risultato; ho poi individuato in questo sottoinsieme l'interprete con ID=661 e controllato "a mano" quante volte compare, trovando che compare una volta in tre opere diverse e due volte in una quarta opera: il conteggio che voglio ottenere deve quindi restituire 4 (e non 5).

    La query da te suggerita cerca naturalmente i duplicati IDEdizione-IDInterprete e me ne trova 1, scartando i 3 che non sono duplicati e quindi il conteggio mi restituisce 1.

    Credo sia possibile anche un'altra cosa: che io non ci abbia capito nulla...
Devi accedere o registrarti per scrivere nel forum
20 risposte