Query Access impossibile...

di il
6 risposte

Query Access impossibile...

E' un mese, non scherzo, che mi sto sbattendo con una query di Access.
Devo contare le occorrenze annuali di una colonna contenente una data.
Quindi voglio che il risultato della query contenga 3 colonne: il conteggio delle occorrenze della data dell'anno corrente, dell'anno passato, e degli altri anni precedenti cioè ad esempio:

Anno attuale----------Anno passato---------Anni precedenti
-----------------------------------------------------------------------
6495-------------------17018-------------------26006-------------


Con SQL Server (e anche con MySQL) la query che ritorna perfettamente questo risultato è:

SELECT SUM(
CASE
WHEN [data_rilevamento] >= CONCAT( YEAR( CURDATE( ) ) , '-01-01' )
THEN 1
END ) AS Anno_Attuale, SUM(
CASE
WHEN [data_rilevamento] < CONCAT( YEAR( CURDATE( ) ) , '-01-01' )
AND [data_rilevamento] >= CONCAT( YEAR( CURDATE( ) ) -1, '-01-01' )
THEN 1
END ) AS Anno_Passato, SUM(
CASE
WHEN [data_rilevamento] < CONCAT( YEAR( CURDATE( ) ) -1, '-01-01' )
THEN 1
END ) AS Anni_Precedenti
FROM raccomandate

Conoscendo superficialmente la sintassi delle query MS Access non trovo soluzione, qualsiasi modifica apporto a questa query genero errori.
Provando con la UNION mi da un risultato esatto nei numeri ma errato nella forma ovvero:

SELECT Count(*) AS [Anno Corrente]
FROM Raccomandate
WHERE Year([data_rilevamento])=Year(Now())
UNION
SELECT Count(*) AS [Anno Corrente]
FROM Raccomandate
WHERE Year([data_rilevamento])=Year(Now())-1
UNION SELECT Count(*) AS [Anno Corrente]
FROM Raccomandate
WHERE Year([data_rilevamento])<=Year(Now())-2;

mi restituisce questo:

Anno attuale
----------------
6495
17018
26006

C'è una buonanima che mi posta la soluzione?
Non ho l'abitudine di chiedere, ma è un mese che non ci dormo.

Grazie in anticipo.

6 Risposte

  • Re: Query Access impossibile...

    Buongiorno,
    Forse si potrebbe semplificare il tutto usando la funzione built in "Dcount" creando in una query i seguenti campi calcolati:
    Totoccorrenze: Dcount con parametro WHERE basato sulla sola data;
    Annocorrente: come sopra ma aggiungi nel parametro WHERE anche l'uguaglianza con l'anno corrente;
    AnnoPrecedente: come sopra ma l'uguaglianza la poni con l'anno corrente - 1;
    Anniprecedenti: il primo campo meno gli altri due...
  • Re: Query Access impossibile...

    A me sembra che la query di Access restituisca data coerenti. Solo che tu li vorresti visualizzati in orizzontale piuttosto che in verticale. Prova questa via logica:
    1. Nella tua query (Query1) aggiungi un campo (ora non riesco a seguire proprio tutta la tua logica) che dovrebbe mostrarti verticalmente in corrispondenza di quei tre valori, proprio
    AnnoAttuale
    AnnoPassato
    AnniPrecedenti
    Quindi salva la Query1
    2. Partendo da Query1, crea una "query a campi incrociati" (Query2) dove gli dici che vuoi che quei campi siano "Intestazione di colonna".
  • Re: Query Access impossibile...

    ..un esempio per favore... sto nel pallone
  • Re: Query Access impossibile...

    Questa ritorna valori e forma corretta... solo che mi sembra 'concettualmente' ridicola...

    SELECT Top 1
    (Select Count([data_rilevamento]) From Raccomandate Where Year([data_rilevamento]) = Year(Now())) AS [Anno corrente],
    (Select Count([data_rilevamento]) From Raccomandate Where Year([data_rilevamento]) = Year(Now())-1) AS [Anno passato],
    (Select Count([data_rilevamento]) From Raccomandate Where Year([data_rilevamento]) <= Year(Now())-2) AS [Anni precedenti]
    FROM Raccomandate;

    Ho aggiunto quel 'Top 1' perchè mi ripeteva lo stesso record per il numero totale dei record presenti nella tabella...
    Sono sicuro che c'è un metodo concettualmente più corretto e più performante...
  • Re: Query Access impossibile...

    mauretto ha scritto:


    ..un esempio per favore... sto nel pallone
    Le query a campi incrociati non sono semplici da spiegare. Occorre leggere tutto dalla guida in linea, da un manuale o affidarsi alla procedura guidata e fare un po' di prove (io, ogni volta che le applico, devo andare a rivedere tutto passo passo come si fa).
  • Re: Query Access impossibile...

    mauretto ha scritto:


    ...
    Sono sicuro che c'è un metodo concettualmente più corretto e più performante...
    Sono pigro, non mi metto a creare una situazione simile alla tua per verificare la sintassi corretta ma rispetto alla query che macina tranquillamente su SQL Server e MySQL di cui al post d'apertura (mi fido, non li uso), in Access quello che più assomiglia al "CASE WHEN" è l'IIf, eventualmente nidificato.
    Attento al fatto che la sintassi dell'IIf cambia se scrivi direttamente in SQL o dalla finestra QBE, quella che l'interfaccia grafica chiama "Struttura query". In QBE il separatore è il puntoevirgola, in SQL è la classica virgola.
Devi accedere o registrarti per scrivere nel forum
6 risposte