Query di raggruppamento con diversi intervalli di date

di Antony73 il
31 risposte

Scusate ragazzi, non mi viene in mente la soluzione al seguente quesito: ho una serie di record con una data inizio e data fine. Vorrei creare una query di ragguppamento dove per ogni record ci sia l'intervallo data dalla più vecchia e quella più recente. Insomma dal al. Grazie.

31 Risposte

  • L' unica soluzione che mi viene in mente è quella di creare una query di raggruppamento (ovviamente senza le date) e creare due campi date calcolati di inizio e fine, ricorrendo a funzioni di aggregazione ma com bassissima efficienza.

  • Un rsempio di dati in tabella e risultato finale?

    Potresti fare la union di più select con date da a 

  • Ci sono 7 campi di cui due campi corrispodono  alle date inizio e fine. Non vedo però come una UNION possa risolvere il problema.

  • 08/04/2024 - Antony73 ha scritto:


    Scusate ragazzi, non mi viene in mente la soluzione al seguente quesito: ho una serie di record con una data inizio e data fine. Vorrei creare una query di ragguppamento dove per ogni record ci sia l'intervallo data dalla più vecchia e quella più recente. Insomma dal al. Grazie.

    Ciao, 

    non penso di aver capito bene la richiesta… provo a fare delle ipotesi.

    Hai provato in raggruppamento con le funzioni Min e Max ? 

  • Faccio un esempio pratico:

    I signori Rossi e Bianchi svolgono distinte attività lavorative in relazione ad uno stesso numero d'ordine in archi temporali diversi:

    nome        cognome       N. Ordine               data inizio         data fine

    Antonio    Rossi                       1                       10/03/2024       17/03/2024

    Antonio    Rossi                       1                       14/03/2024       18/03/2024

    Antonio    Rossi                       1                       11/03/2024       19/03/2024

    Gianni      Bianchi                    2                       01/02/2024       01/03/2024

    Gianni      Bianchi                    2                       10/02/2024       10/03/2024

    Gianni      Bianchi                    2                       14/02/2024       03/03/2024

    Dovrei ottenere:

    Antonio    Rossi                       1                       10/03/2024       19/03/2024

    Gianni      Bianchi                    2                       01/02/2024       10/03/2024

  • Allora con il Min e il Max function di raggruppamento:

    Esempio

    SELECT TblOrdini.Nome, TblOrdini.Cognome, TblOrdini.NrOrdine, Min(TblOrdini.DateStart) AS MinDiDateStart, Max(TblOrdini.DateEnd) AS MaxDiDateEnd
    FROM TblOrdini
    GROUP BY TblOrdini.Nome, TblOrdini.Cognome, TblOrdini.NrOrdine;

    Risultato:


    Se la tabella in questione contiene i seguenti records:

  • Nascerebbe il problema con:

    Antonio    Rossi                       1                       10/03/2024       17/03/2024

    Antonio    Rossi                       1                       14/04/2024       10/05/2024

    risultato:

    Antonio    Rossi                       1                       10/03/2024       18/05/2024

    non so a cosa serve il dato ma rischi di avere valori errati.

    se si tratta di calcolo giorni lavorativi risulterebbe un periodo da retribuire dal 10/3 al 18/5 piuttosto che dal 10/3 al 17/3 + dal 14/4 al 10/5

    ma anche in caso di mansioni con diverse retribuzioni con i dati da te descritti.

  • Si hai ragione Franco, grazie. Ci ho riflettuto e ho convenuto che mi sono perso in un bicchier d'acqua. 

    09/04/2024 - sihsandrea ha scritto:


    se si tratta di calcolo giorni lavorativi risulterebbe un periodo da retribuire dal 10/3 al 18/5 piuttosto che dal 10/3 al 17/3 + dal 14/4 al 10/5

    Scusa Andrea, ma non capisco per quale motivo l'intervallo data si debba estendere fino al 18/05.

  • 09/04/2024 - sihsandrea ha scritto:


    Nascerebbe il problema con:

    Antonio    Rossi                       1                       10/03/2024       17/03/2024

    Antonio    Rossi                       1                       14/04/2024       10/05/2024

    risultato:

    Antonio    Rossi                       1                       10/03/2024       18/05/2024

    Scusa ma non ho capito bene… 

    se si cambia la data di fine in 18/05/2024… per esempio :

    Risultato:


    Quindi si ottiene sempre il periodo massimo che impegna quell'ordine … dalla data alla data.
    Io l'avrei capita in questo senso l'esigenza…


    Tu invece cosa intendevi segnalare di anomalia ? 

  • 09/04/2024 - Antony73 ha scritto:


    Scusa Andrea, ma non capisco per quale motivo l'intervallo data si debba estendere fino al 18/05.

    Quando parlavi di intervalli di data pensavo a periodi distaccati tra loro non sovrapposti.

    Una ricerca da a con le date modificate da me che potrebbero risultare nel normale svolgimento lavorativo, rischi di falsare il risultato. Ovviamente parlo per pura ipotesi, non sapendo a cosa si riferiscono i dati immessi.

    Sempre per ipotesi, se le ore lavorative per un prodotto finito richiede 10 giorni suddivisi in 3 mesi con un filtro da a ottieni 90 giorni piuttosto che 10 giorni.

    Era solo un'osservazione.

    Sempre nell'esempio dei dati che hai messo come esempio, per lo stesso ordine utilizzi 3 record.

    Ovviamente non dico che sia concettualmente errato ma si potrebbe prospettare l'idea di inserire un solo record da a vista la continuità. Sarebbe diverso (per come la penso io, non perché tu stia sbagliando in qualcosa) se mario rossi lavora dal 1/1 al 10/1 e dal 15/1 al 22/1 su ordine 1 e dal 3/1 al 20/1 e dal 23/1 al 31/1 su ordine 2. In quel caso, sempre mia considerazione non necessariamente corretta, abbiamo:

    Mario rossi dal 1/1 al 22/1 ordine 1…. 23 gg ma sono 18 gg reali

    Mario rossi dal 3/1 al 31/1 ordine 2… 28 gg ma sono 25 gg reali

    A seconda della mole.dei dati e della loro frammentazione temporale, rischi di avere dati falsati.

    Se questo dato serve per calcolare le ore di lavoro da imputare all'ordine non va bene.

    Solo un'osservazione personale.

  • No. Non serve per calcolare le ore lavorative, ma solo per tenere traccia delle giornate in cui quelle attività sono state svolte.

  • Scusate ancora ragazzi. E se la situazione fosse quella di seguito indicata? Se ci fosse, cioè, un ulteriore periodo non sovrapponibile con il primo?

    nome        cognome       N. Ordine               data inizio         data fine

    Antonio    Rossi                       1                       10/03/2024       17/03/2024

    Antonio    Rossi                       1                       14/03/2024       18/03/2024

    Antonio    Rossi                       1                       11/03/2024       19/03/2024

    Gianni      Bianchi                    2                       01/02/2024       01/03/2024

    Gianni      Bianchi                    2                       10/02/2024       10/03/2024

    Gianni      Bianchi                    2                       14/02/2024       03/03/2024

    Antonio    Rossi                       1                       10/06/2024       17/06/2024

    Antonio    Rossi                       1                       16/06/2024       22/06/2024

    Dovrei ottenere:

    Antonio    Rossi                       1                       10/03/2024       19/03/2024

    Antonio    Rossi                       1                       10/06/2024       22/06/2024

    Gianni      Bianchi                    2                       01/02/2024       10/03/2024

  • 09/04/2024 - Antony73 ha scritto:


    No. Non serve per calcolare le ore lavorative, ma solo per tenere traccia delle giornate in cui quelle attività sono state svolte.

    Beh nel mio esempio viene fuori che è stata svolta in un tempo maggiore del necessario…

    10/04/2024 - Antony73 ha scritto:


    Scusate ancora ragazzi. E se la situazione fosse quella di seguito indicata? Se ci fosse, cioè, un ulteriore periodo non sovrapponibile con il primo?

    Questo è solo il primo nodo che viene al pettine…

    Io andrei di codice (se solo sapessi qual è lo scopo).

    Chiedi da a ma dai dati inseriti nin ha senso.

    Non ha senso mario ordine 1 lavora dal 1/1 al 10/1 e dal 2/1 al 3/1.

    Dal 2/1 al 3/1 cos'è, lavoro con straordinario? E max e min come fa a distinguerli?

    Se spieghi cosa ti serve magari ti suggeriamo di aprire un'altra discussione.

Devi accedere o registrarti per scrivere nel forum
31 risposte