Dividere risultato di una query

di il
8 risposte

Dividere risultato di una query

Ciao a Tutti!
Mi ritrovo una query così composta:

SELECT Rapporti.Nominativo, Rapporti.Mese, Rapporti.Ore
FROM Rapporti
WHERE (((Rapporti.Mese) In (SELECT TOP 24 Mese
FROM Rapporti AS Dupe
WHERE Dupe.Nominativo = Rapporti.Nominativo
ORDER BY Dupe.mese DESC)))
ORDER BY Rapporti.Nominativo DESC , Rapporti.Mese DESC;

Il risultato che ottengo è l'attività delle ore degli ultimi 24 mesi per ogni nominativo.
Quindi avrò 24 x N. Nominativi righe

Avrei la necessità di dividere il risultato di questa query in 2 query, una che visualizzi i primi 12 mesi e l'altra i successivi 12 mesi.
Come faccio a dividere i risultati?
Avevo pensato di usare la funzione top 12 giocando con gli ordinamenti, ma alla fine mi incarto..

Grazie per il sostegno!!

8 Risposte

  • Re: Dividere risultato di una query

    Fatico a capire la progressione numerica del campo Mese che forse non è legato al nu.ero del mese Gennaio=1 ecc... quanto ad un tuo progressivo...?

    Se tu usassi un campo data... non sarebbe sensato e più lineare... anche se per Primo 12 mesi ed ultimi 12 mesi non si comprende se relativi o assoluti all'annulalità...

    Insomma con i dati forniti la prima osservazione sarebbe mettere in discussione il metodo, ma sicuramente sarebbe meglio prima avere un quadro complessivo più chiaro.
  • Re: Dividere risultato di una query

    Hai ragione, scrivendo ho dato molte cose per scontate..
    la tabella rapporti dalla quale attingo i dati viene popolata periodicamente inserendo una riga per nominativo contenente, oltre al nominativo, le ore di lavoro svolto (campo numerico) e il mese di riferimento (campo data). La data inserita avrà come giorno sempre 1, cambierà solo il mese e l'anno.
    L'obiettivo della query è quello di visualizzare gli ultimi 24 mesi di attività per ogni singolo nominativo.
    La progressione del campo mese è data semplicemente ordinando la tabella per data e prelevando i primi 24 record. Visto che nella tabella ho diversi nominativi, per estrapolare i dati di ogni nominativo ho usato il gioco del "dupe".
    Il concetto di primi 12 mesi e ultimi 12 mesi era riferito al risultato della query esposta. In pratica i primi 12 risultati e successivi 12 risultati della query.
    Quindi ricapitolando... la tabella rapporti conterrà... ipotizziamo il caso di 3 nominativi.. al posto dei puntini consideriamo tutti gli altri mesi intermedi...

    NOMINATIVO DATA ORE
    NOME1 01/01/2020 6
    NOME2 01/01/2020 10
    NOME3 01/01/2020 4
    .
    .
    .
    NOME1 01/12/2020 3
    NOME2 01/12/2020 6
    NOME3 01/12/2020 9
    .
    .
    .
    NOME1 01/01/2025 6
    NOME2 01/01/2025 7
    NOME3 01/01/2025 9

    la query, ordina la tabella per data, dalla più recente alla più vecchia, ed estrapola i primi 24 record per ogni nominativo...
    quindi, ipotizzando che la tabella contenga i dati dal 1 gennaio 2020 al 1 gennaio 2025, il risultato ottenuto sarebbe 24 record per ogni nominativo dal 1 gennaio 2025 al 1 gennaio 2024. Fino a qui la query funziona correttamente...
    Adesso vorrei dividere questo risultato in 2... quindi una query dovrebbe darmi come risultato dal 1 gennaio 2025 al 1 dicembre 2025 per ogni nominativo e la seconda dal 1 gennaio 2024 al 1 dicembre 2024.

    Spero di aver chiarito e non confuso di più le idee..
  • Re: Dividere risultato di una query

    Allora sbagli logica... se vuoi avere le 2 query efficienti.
    Ti basta ovviamente raggruppare per data ma aggiungere un vincolo di criterio sul campo data in cui hai
    ULTIMI 12 MESI: Criterio Data>dateadd("m", -13,Date())
    DA 12÷24 mesi : Criterio Data Beetwen Data>dateadd("m", -24,Date()) AND Data>dateadd("m", -13,Date())

    Fai attenzione a dove scriviil criterio per modificare VIRGOLA/PUNTOVIRGOLA.

    Verifica anche il valore giusto da sottrarre per avere gli intervalli corretti, mi riferisco a 12 o 13 e 24 o 25 ecc a seconda sia >= o solo >, mentre il Beetwen include sempre gli estremi.

    La logica che ti ho proposto è estremamente semplice e funzione.
  • Re: Dividere risultato di una query

    Grazie Alex, di certo la tua logica è meno contorta della mia!
    Ho applicato i concetti adattandoli alle informazioni che volevo ottenere e tutto sembra andare alla grande...
    Anziché concentrarmi sul mese lavoro direttamente sull'anno e tutto diventa ancora più semplice

    Solo una domanda...
    Adesso ho la necessità di fare un'ulteriore raffinamento... nel senso che l'anno lavorativo che devo analizzare non inizia da gennaio ma da settembre e finisce ad agosto... quindi gli ultimi 2 anni lavorativi dal 2020 diventano settembre 2018/agosto 2019 e settembre 2019/agosto 2020

    Nel caso delle 2 query da realizzare se volessi vedere l'ultimo anno lavorativo, dovrei ottenere il periodo (Settembre 2019/Agosto 2020)


    Ma ho difficoltà a lavorare con il between...probabilmente non riesco a passare correttamente i parametri al between, perché in questo caso ci sono altre "AND" da aggiungere... tipo... between di data>(Anno-1) e (Mese>8) AND (Anno) e (Mese<9) come lo traduco?
  • Re: Dividere risultato di una query

    Se usi la soluzuone che ti avevo dato io... sostituendo al valore di Sistema Date() la data di calcolo massima faceva tutto...

    Sostituiscila con #01/09/2020# e, come ti dicevo verifica e numeri...
  • Re: Dividere risultato di una query

    Ok! Il problema è che non posso lasciare la data fissa, se lancio la query fra due anni i risultati non avrebbero più senso.
    Devo ragionare in termini di "date()" così come suggerivi prima.

    E' possibile ricostruire la data e passargliela? Spiego meglio... da date() costruisco la nuova data con anno=anno-1 e mese=9
  • Re: Dividere risultato di una query

    Ovviamente per quello esistono le queries con Parametro... oppurr ricostruisci il predicato...
  • Re: Dividere risultato di una query

    Era più semplice di quello che pensavo...
    Queste le 2 query che volevo realizzare:

    Anno Corrente= Da Settembre 2019 ad Agosto 2020
    >=DateAdd("m";-12;CDate("01/09/" & Year(Date()-1))) And <=CDate("01/08/" & Year(Date()))

    Anno Precedente= Da Settembre 2018 ad Agosto 2019
    >=DateAdd("m";-24;CDate("01/09/" & Year(Date()-2))) And <=CDate("01/08/" & Year(Date())-1)

    Grazie di cuore alle indicazioni di Alex !
Devi accedere o registrarti per scrivere nel forum
8 risposte