Condividi:        

[ACCESS] Query per esporre dati aggregati

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

[ACCESS] Query per esporre dati aggregati

Postdi sbs » 07/03/14 15:43

Sono conscio che il titolo non è chiaro, ma non so come descrivere il mio problema!

Ora io ho una tabella con tra gli altri questi campi:
==============
DATA (DATA)
ANAG (Cognome & Nome)
SEDE
===========


TABELLA
Codice: Seleziona tutto
DATA   SEDE   ANAG
01/01/2014   BOLOGNA   Rossi Mario
02/01/2014   BOLOGNA   Rossi Mario
03/01/2014   BOLOGNA   Rossi Mario
04/01/2014   BOLOGNA   Rossi Mario
05/01/2014   BOLOGNA   Rossi Mario
06/01/2014   BOLOGNA   Rossi Mario
07/01/2014   BOLOGNA   Rossi Mario
08/01/2014   FERRARA   Rossi Mario
09/01/2014   FERRARA   Rossi Mario
10/01/2014   FERRARA   Rossi Mario
11/01/2014   FERRARA   Rossi Mario
12/01/2014   FERRARA   Rossi Mario
13/01/2014   FERRARA   Rossi Mario
14/01/2014   FERRARA   Rossi Mario
15/01/2014   FERRARA   Rossi Mario
16/01/2014   FERRARA   Rossi Mario
17/01/2014   FERRARA   Rossi Mario
18/01/2014   FERRARA   Rossi Mario
01/01/2014   BOLOGNA   Bianchi Giorgio
02/01/2014   BOLOGNA   Bianchi Giorgio
03/01/2014   BOLOGNA   Bianchi Giorgio
04/01/2014   BOLOGNA   Bianchi Giorgio
05/01/2014   BOLOGNA   Bianchi Giorgio
06/01/2014   BOLOGNA   Bianchi Giorgio
07/01/2014   BOLOGNA   Bianchi Giorgio
08/01/2014   FERRARA   Bianchi Giorgio
09/01/2014   FERRARA   Bianchi Giorgio
10/01/2014   FERRARA   Bianchi Giorgio
11/01/2014   FERRARA   Bianchi Giorgio
12/01/2014   FERRARA   Bianchi Giorgio
13/01/2014   FERRARA   Bianchi Giorgio
14/01/2014   FERRARA   Bianchi Giorgio
15/01/2014   FERRARA   Bianchi Giorgio
16/01/2014   FERRARA   Bianchi Giorgio
17/01/2014   FERRARA   Bianchi Giorgio
18/01/2014   FERRARA   Bianchi Giorgio
01/01/2014   MODENA   Verdi Giovanni
02/01/2014   MODENA   Verdi Giovanni
03/01/2014   MODENA   Verdi Giovanni
04/01/2014   MODENA   Verdi Giovanni
05/01/2014   MODENA   Verdi Giovanni
06/01/2014   MODENA   Verdi Giovanni
07/01/2014   MODENA   Verdi Giovanni
08/01/2014   MODENA   Verdi Giovanni
09/01/2014   MODENA   Verdi Giovanni
10/01/2014   MODENA   Verdi Giovanni
11/01/2014   MODENA   Verdi Giovanni
12/01/2014   MODENA   Verdi Giovanni
13/01/2014   MODENA   Verdi Giovanni
14/01/2014   MODENA   Verdi Giovanni
15/01/2014   MODENA   Verdi Giovanni
16/01/2014   MODENA   Verdi Giovanni
17/01/2014   MODENA   Verdi Giovanni
18/01/2014   MODENA   Verdi Giovanni





Avrei bisogno di ottenere una tabella (Query) che mi desse questo risultato:

Query
Codice: Seleziona tutto
DATA   SEDE   [ANAG aggregati]
01/01/2014   BOLOGNA   Rossi Mario;Bianchi Giorgio
02/01/2014   BOLOGNA   Rossi Mario;Bianchi Giorgio
03/01/2014   BOLOGNA   Rossi Mario;Bianchi Giorgio
04/01/2014   BOLOGNA   Rossi Mario;Bianchi Giorgio
05/01/2014   BOLOGNA   Rossi Mario;Bianchi Giorgio
06/01/2014   BOLOGNA   Rossi Mario;Bianchi Giorgio
07/01/2014   BOLOGNA   Rossi Mario;Bianchi Giorgio
08/01/2014   FERRARA   Rossi Mario;Bianchi Giorgio
09/01/2014   FERRARA   Rossi Mario;Bianchi Giorgio
10/01/2014   FERRARA   Rossi Mario;Bianchi Giorgio
11/01/2014   FERRARA   Rossi Mario;Bianchi Giorgio
12/01/2014   FERRARA   Rossi Mario;Bianchi Giorgio
13/01/2014   FERRARA   Rossi Mario;Bianchi Giorgio
14/01/2014   FERRARA   Rossi Mario;Bianchi Giorgio
15/01/2014   FERRARA   Rossi Mario;Bianchi Giorgio
16/01/2014   FERRARA   Rossi Mario;Bianchi Giorgio
17/01/2014   FERRARA   Rossi Mario;Bianchi Giorgio
18/01/2014   FERRARA   Rossi Mario;Bianchi Giorgio
01/01/2014   MODENA   Verdi Giovanni
02/01/2014   MODENA   Verdi Giovanni
03/01/2014   MODENA   Verdi Giovanni
04/01/2014   MODENA   Verdi Giovanni
05/01/2014   MODENA   Verdi Giovanni
06/01/2014   MODENA   Verdi Giovanni
07/01/2014   MODENA   Verdi Giovanni
08/01/2014   MODENA   Verdi Giovanni
09/01/2014   MODENA   Verdi Giovanni
10/01/2014   MODENA   Verdi Giovanni
11/01/2014   MODENA   Verdi Giovanni
12/01/2014   MODENA   Verdi Giovanni
13/01/2014   MODENA   Verdi Giovanni
14/01/2014   MODENA   Verdi Giovanni
15/01/2014   MODENA   Verdi Giovanni
16/01/2014   MODENA   Verdi Giovanni
17/01/2014   MODENA   Verdi Giovanni
18/01/2014   MODENA   Verdi Giovanni


Per poi, attraverso una Query a Campi incrociati avere:
Query a campi incrociati
Codice: Seleziona tutto
DATA   FERRARA   BOLOGNA   MODENA
01/01/2014   NULL   Rossi Mario;Bianchi Giorgio   Verdi Giovanni
02/01/2014   NULL   Rossi Mario;Bianchi Giorgio   Verdi Giovanni
03/01/2014   NULL   Rossi Mario;Bianchi Giorgio   Verdi Giovanni
04/01/2014   NULL   Rossi Mario;Bianchi Giorgio   Verdi Giovanni
05/01/2014   NULL   Rossi Mario;Bianchi Giorgio   Verdi Giovanni
06/01/2014   NULL   Rossi Mario;Bianchi Giorgio   Verdi Giovanni
07/01/2014   NULL   Rossi Mario;Bianchi Giorgio   Verdi Giovanni
08/01/2014   Rossi Mario;Bianchi Giorgio   NULL   Verdi Giovanni
09/01/2014   Rossi Mario;Bianchi Giorgio   NULL   Verdi Giovanni
10/01/2014   Rossi Mario;Bianchi Giorgio   NULL   Verdi Giovanni
11/01/2014   Rossi Mario;Bianchi Giorgio   NULL   Verdi Giovanni
12/01/2014   Rossi Mario;Bianchi Giorgio   NULL   Verdi Giovanni
13/01/2014   Rossi Mario;Bianchi Giorgio   NULL   Verdi Giovanni
14/01/2014   Rossi Mario;Bianchi Giorgio   NULL   Verdi Giovanni
15/01/2014   Rossi Mario;Bianchi Giorgio   NULL   Verdi Giovanni
16/01/2014   Rossi Mario;Bianchi Giorgio   NULL   Verdi Giovanni
17/01/2014   Rossi Mario;Bianchi Giorgio   NULL   Verdi Giovanni
18/01/2014   Rossi Mario;Bianchi Giorgio   NULL   Verdi Giovanni




Come posso risolvere?
Avatar utente
sbs
Utente Senior
 
Post: 114
Iscritto il: 18/09/10 11:25

Sponsor
 

Postdi archimede » 08/03/14 09:29

Per il primo quesito puoi provare così:

1) Crei la seguente funzione
Codice: Seleziona tutto
Function GetNomi(ByVal Data As String, ByVal Sede As String)
    Dim strSql, Nomi As String
    Dim rs As DAO.Recordset

    strSql = "SELECT DISTINCT anag FROM tabella WHERE format(data, 'dd/mm/yyyy') = '" & Data & _
             "' AND sede = '" & Sede & "' ORDER BY 1;"
    Set rs = CurrentDb.OpenRecordset(strSql)

    While (Not rs.EOF)
      If Nomi = "" Then
         Nomi = rs!anag
      Else
         Nomi = Nomi & ";" & rs!anag
      End If
      rs.MoveNext
    Wend

    rs.Close
    Set rs = Nothing

    GetNomi = Nomi
End Function
2) Crei la seguente query:
Codice: Seleziona tutto
SELECT data, sede, GetNomi(format(data, 'dd/mm/yyyy'), sede) AS aggregati
  FROM tabella
 GROUP BY data, sede
 ORDER BY data, sede;

Il secondo quesito mi pare fattibile solo se le sedi sono fisse:
Codice: Seleziona tutto
SELECT data, GetNomi(format(data, 'dd/mm/yyyy'), 'BOLOGNA') AS Bologna,
             GetNomi(format(data, 'dd/mm/yyyy'), 'FERRARA') AS Ferrara,
             GetNomi(format(data, 'dd/mm/yyyy'), 'MODENA') AS Modena
  FROM tabella
 GROUP BY data
 ORDER BY data;

Se il numero di colonne deve essere variabile in base al contenuto della tabella, la vedo tosta.

HTH.

Alessandro
archimede
Moderatore
 
Post: 2851
Iscritto il: 07/11/02 12:41
Località: Genova

Re: [ACCESS] Query per esporre dati aggregati

Postdi sbs » 08/03/14 18:54

Ho cercato di usare il tuo modulo cambiando i nomi con i miei nomi di campo
Che sono:
-DATA
-ANASTUD (ANAG)
-BREVE (Sede)

Codice: Seleziona tutto
Function GetANASTUD(ByVal Data As String, ByVal Breve As String)
    Dim strSql, ANASTUD As String
    Dim rs As DAO.Recordset
    strSql = "SELECT DISTINCT ANASTUD FROM tabella WHERE format(data, 'dd/mm/yyyy') = '" & Data & _
             "' AND breve = '" & Breve & "' ORDER BY 1;"
    Set rs = CurrentDb.OpenRecordset(strSql)
    While (Not rs.EOF)
      If ANASTUD = "" Then
         ANASTUD = rs!anag
      Else
         ANASTUD = ANASTUD & ";" & rs! ANASTUD
      End If
      rs.MoveNext
    Wend
    rs.Close
    Set rs = Nothing
    GetANASTUD = ANASTUD
End Function




ma quando lancio la query
Codice: Seleziona tutto
SELECT data, breve, GetANASTUD (format(data, 'dd/mm/yyyy'), breve) AS aggregati
GROUP BY [CALENDARIO DI STAGE GLOBALE 22].Data
PIVOT [CALENDARIO DI STAGE GLOBALE 22].breve;
GROUP BY data, breve
 ORDER BY data, breve;


mi dice modulo GetANASTUD non trovato anche se esiste!.


Cercando soluzioni alternative ho realizzato questa Query che funziona bene solo per le sedi con uno o due persone assegnate.

Codice: Seleziona tutto
SELECT [CALENDARIO DI STAGE GLOBALE].Data,
[CALENDARIO DI STAGE GLOBALE].breve,
IIf((First([CALENDARIO DI STAGE GLOBALE].ANASTUD))=(Last([CALENDARIO DI STAGE GLOBALE].ANASTUD)),(First([CALENDARIO DI STAGE GLOBALE].ANASTUD)),(First([CALENDARIO DI STAGE GLOBALE].ANASTUD)) & "-" & (Last([CALENDARIO DI STAGE GLOBALE].ANASTUD))) AS aggregato
FROM [CALENDARIO DI STAGE GLOBALE]
GROUP BY [CALENDARIO DI STAGE GLOBALE].Data,
 [CALENDARIO DI STAGE GLOBALE].breve;


Per la crociata ho fatto:

Codice: Seleziona tutto
TRANSFORM First([CALENDARIO DI STAGE GLOBALE 22].aggregato) AS PrimoDiaggregato
SELECT [CALENDARIO DI STAGE GLOBALE 22].Data
FROM [CALENDARIO DI STAGE GLOBALE 22]
GROUP BY [CALENDARIO DI STAGE GLOBALE 22].Data
PIVOT [CALENDARIO DI STAGE GLOBALE 22].breve;


Il problema mi resta con alcune sedi in cui ho più di 2 persone nello stesso giorno( in una 5 persone in una altra 4 e nell’ultima 3)!!!
Avatar utente
sbs
Utente Senior
 
Post: 114
Iscritto il: 18/09/10 11:25

Postdi archimede » 08/03/14 21:28

sbs ha scritto:Ho cercato di usare il tuo modulo cambiando i nomi con i miei nomi di campo
Te ne sei perso almeno uno; inoltre devi anche cambiare il nome della tabella.
sbs ha scritto:ma quando lancio la query
Quella query è un po' diversa dalla mia.

Non sono più molto aggiornato sugli sviluppi di Access: non sapevo avessero introdotto TRANSFORM e PIVOT nell'SQL. Con quelle dovresti riuscire a raggiungere il tuo obiettivo, ma io non ho una versione di Access recente con cui fare prove.

Buona fortuna.

Alessandro
archimede
Moderatore
 
Post: 2851
Iscritto il: 07/11/02 12:41
Località: Genova

Re: [ACCESS] Query per esporre dati aggregati

Postdi sbs » 09/03/14 20:42

Cercando di provare la tua strada ho visto un paio di errori (non avevo visto alcuni nomi di campi/tabelle da sistemare).

ora è così:

MODULO (è un modulo vero non una macro?)

Codice: Seleziona tutto
Function GetAnastud(ByVal Data As String, ByVal Breve As String)
    Dim strSql, Anastud As String
    Dim rs As DAO.Recordset

    strSql = "SELECT DISTINCT anaSTUD FROM [CALENDARIO DI STAGE GLOBALE] WHERE format(data, 'dd/mm/yyyy') = '" & Data & _
             "' AND breve = '" & Breve & "' ORDER BY 1;"
    Set rs = CurrentDb.OpenRecordset(strSql)

    While (Not rs.EOF)
      If Anastud = "" Then
         Anastud = rs!Anastud
      Else
         Anastud = Anastud & ";" & rs!Anastud
      End If
      rs.MoveNext
    Wend

    rs.Close
    Set rs = Nothing

    GetAnastud = Anastud
End Function


Il dubbio è che "ANASTUD" possa assumere diversi significati e che forse mi conviene cambiare in alcuni punti (è un campo e forse in alcuni punti è invece una variabikle definita)

Codice: Seleziona tutto
SELECT [CALENDARIO DI STAGE GLOBALE].data, [CALENDARIO DI STAGE GLOBALE].breve, GetAnastud AS aGGREGATA
FROM [CALENDARIO DI STAGE GLOBALE]
GROUP BY [CALENDARIO DI STAGE GLOBALE].data, [CALENDARIO DI STAGE GLOBALE].breve
ORDER BY [CALENDARIO DI STAGE GLOBALE].data, [CALENDARIO DI STAGE GLOBALE].breve;


adesso da errore, non funziona come modulo ma come variabile mancante che mi chiede!!
Avatar utente
sbs
Utente Senior
 
Post: 114
Iscritto il: 18/09/10 11:25

Postdi archimede » 09/03/14 21:42

Codice: Seleziona tutto
SELECT data, breve, GetAnastud(format(data, 'dd/mm/yyyy'), breve) AS aggregati
  FROM [CALENDARIO DI STAGE GLOBALE]
 GROUP BY data, breve
 ORDER BY data, breve;
Alessandro
archimede
Moderatore
 
Post: 2851
Iscritto il: 07/11/02 12:41
Località: Genova

Re: [ACCESS] Query per esporre dati aggregati

Postdi sbs » 09/03/14 22:36

Continua il tentativo ho rivisto il modulo lasciando nomi nei punti "giusti"

ora è così
Codice: Seleziona tutto
Function GetNomi(ByVal Data As String, ByVal Sede As String)
    Dim strSql, Nomi As String
    Dim rs As DAO.Recordset


    strSql = "SELECT DISTINCT Anastud FROM [CALENDARIO DI STAGE GLOBALE] WHERE format(data, 'dd/mm/yyyy') = '" & Data & _
             "' AND breve = '" & Breve & "' ORDER BY 1;"
    Set rs = CurrentDb.OpenRecordset(strSql)

    While (Not rs.EOF)
      If Nomi = "" Then
         Nomi = rs!Anastud
      Else
         Nomi = Nomi & ";" & rs!Anastud
      End If
      rs.MoveNext
    Wend

    rs.Close
    Set rs = Nothing

    GetNomi = Nomi
End Function


poi cambiato nome al modulo evocato

Codice: Seleziona tutto
SELECT data, breve, GetNomi(format(data, 'dd/mm/yyyy'), breve) AS aggregati
  FROM [CALENDARIO DI STAGE GLOBALE]
 GROUP BY data, breve
 ORDER BY data, breve;


Mi da errore:
"errore di compilazione. tipo non definito dall'utente

evvidenziato la parte
"rs As DAO.Recordset"

dato ok diventa giallo la prima riga.
Avatar utente
sbs
Utente Senior
 
Post: 114
Iscritto il: 18/09/10 11:25

Postdi archimede » 09/03/14 23:35

Ci saremmo risparmiati due o tre messaggi se avessi specificato i nomi REALI degli oggetti nel tuo primo post...

Comunque, prova così:
Codice: Seleziona tutto
Function GetNomi(ByVal Data As String, ByVal Sede As String)
    Dim strSql, Nomi As String
    Dim rs As DAO.Recordset

    strSql = "SELECT DISTINCT Anastud FROM [CALENDARIO DI STAGE GLOBALE] WHERE format(data, 'dd/mm/yyyy') = '" & Data & _
         "' AND breve = '" & Sede & "' ORDER BY 1;"
    Set rs = CurrentDb.OpenRecordset(strSql)

    While (Not rs.EOF)
      If Nomi = "" Then
         Nomi = rs!Anastud
      Else
         Nomi = Nomi & ";" & rs!Anastud
      End If
      rs.MoveNext
    Wend

    rs.Close
    Set rs = Nothing

    GetNomi = Nomi
End Function
archimede
Moderatore
 
Post: 2851
Iscritto il: 07/11/02 12:41
Località: Genova

Re: [ACCESS] Query per esporre dati aggregati

Postdi sbs » 10/03/14 08:01

Stesso errore!

I nomi erano quelli del DB 2011/13! non ricordavo di averli modificati l'ho notato solo quando sonoa ndato a sistemare le query!
(I beg your pardon)

Scusa ma nel pezzo:
" "' AND breve = '" & Sede & "' ORDER BY 1;""
(Sede) è il nome di una variabile e non di un campo o è un refuso?
Avatar utente
sbs
Utente Senior
 
Post: 114
Iscritto il: 18/09/10 11:25

Postdi archimede » 10/03/14 09:09

sbs ha scritto:Stesso errore!
Non ho capito qual è l'errore esatto... Verifica che la libreria DAO sia referenziata nel tuo progetto (Strumenti -> Referenze o qualcosa del genere).

Sede è il nome di una variabile, più precisamente uno dei due parametri che vengono passati alla funzione.

HTH.

Alessandro
archimede
Moderatore
 
Post: 2851
Iscritto il: 07/11/02 12:41
Località: Genova

Re: [ACCESS] Query per esporre dati aggregati

Postdi sbs » 10/03/14 20:43

Azz...!!!!!!!
Dalla versione 2000 non è più abilitata di default!!!!!

Guardato, abilitato e tutto funziona!!!!
Avatar utente
sbs
Utente Senior
 
Post: 114
Iscritto il: 18/09/10 11:25


Torna a Applicazioni Office Windows


Topic correlati a "[ACCESS] Query per esporre dati aggregati":


Chi c’è in linea

Visitano il forum: Nessuno e 24 ospiti