Query di raggruppamento e filtro con criteri di campi diversi

di il
13 risposte

Query di raggruppamento e filtro con criteri di campi diversi

Ho una query di raggruppamento che ha un collegamento con un'altra avente tabelle di origine e campi in comuni, ma i collegamento ha a sola funzione di filtrare alcuni campi da utilizzare nella altra.

Mi spiego meglio una query con dei nominativi e numerosi parametri raggruppati, tra cui anche delle qualifiche, ha bisogno anche di un'altra anch'essa raggruppata ma che mi permette di ordinare le qualifiche filtrando l'ultima acquisita per decorrenza o priorità.

Vorrei unificarla ma non mi riesce di filtrare la sola qualifica in base alla decorrenza più recente (ultima [Decorrenza]).
Ho anche provato ad usare la funzione Dlookup, ma il riferimento a campi della stessa query all'avvio mi vengono richiesti con una finestrella di input

13 Risposte

  • Re: Query di raggruppamento e filtro con criteri di campi diversi

    La trovo una descrizione molto confusa e personalmente ho capito davvero poco. Mostra tabelle, campi e relazioni del tuo db.

  • Re: Query di raggruppamento e filtro con criteri di campi diversi

     e per via dei 16/11/2024 - Antony73 ha scritto:


    La trovo una descrizione molto confusa e personalmente ho capito davvero poco. Mostra tabelle, campi e relazioni del tuo db.

    Lo capisco, che è difficile interpretare ciò che ho scritto, ma si tratta di un database molto articolato che non era mio ho modificato nel tempo per alcune mie esigenze, ma molte tabelle query e relazioni, è anche questa la ragione che mi ha spinto a voler unificare le 2 query e per via dei moti dati sensibili, anche tra i campi e tabelle, purtroppo non posso postare nulla,

  • Re: Query di raggruppamento e filtro con criteri di campi diversi

    Non devi mostrare i record. Tabelle, campi e relazioni non sono dati sensibili.

  • Re: Query di raggruppamento e filtro con criteri di campi diversi

  • Re: Query di raggruppamento e filtro con criteri di campi diversi

    L'immagine mostra una visualizzazione struttura query. In essa non è chiaro quali sono tabelle e quali query. A primo colpo d'occhio ho l'impressione che il database non sia normalizzato.

  • Re: Query di raggruppamento e filtro con criteri di campi diversi

    Quelle sono tutte tabelle, infatti il mio intento era fare a meno di un'altra query collegata con l'intento ottenere lo stesso risultato di filtrazione

  • Re: Query di raggruppamento e filtro con criteri di campi diversi

    Chi ha fatto quello schema relazionale ha frammentato dati e creato tabelle superflue…

    Parti dal dipendente, che diventa tale nel momento in cui popoli la tabella protocollomatr2 con un solo record quindi 1 a 1 a meno che un dipendente non abbia n matricole (ne dubito).

    Progressione presa in carico… beh, a meno che non sia un contratto ad intermittenza mi sa che scrivi un solo record per dipendente.

    Progressione lavorativa non so cosa indichi ma a me sembra un sinonimo di carriera.. ergo un altro duplicato.

    Mi fermo qui…

    Per il quesito che hai posto:

    16/11/2024 - Azucarea ha scritto:


    Mi spiego meglio una query con dei nominativi e numerosi parametri raggruppati, tra cui anche delle qualifiche, ha bisogno anche di un'altra anch'essa raggruppata ma che mi permette di ordinare le qualifiche filtrando l'ultima acquisita per decorrenza o priorità.

    Comincia a lavorare sulle due query e mostrale in modo da capire che logica hanno le tabelle che hai mostrato e perché le que sql non si ottengono con un dato comune.

    Fatta la query A e la query B possiamo vedere se si può tentare un select* from A inner join B….

    Se si puoi creare una unica sql select di select.

  • Re: Query di raggruppamento e filtro con criteri di campi diversi

    16/11/2024 - sihsandrea ha scritto:


    Chi ha fatto quello schema relazionale ha frammentato dati e creato tabelle superflue…

    Parti dal dipendente, che diventa tale nel momento in cui popoli la tabella protocollomatr2 con un solo record quindi 1 a 1 a meno che un dipendente non abbia n matricole (ne dubito).

    Succede che non forniscono il numero di matricola, in dipendenti ci sono dati anagrafici, in matricola elementi di ufficio.

    16/11/2024 - sihsandrea ha scritto:


    Progressione presa in carico… beh, a meno che non sia un contratto ad intermittenza mi sa che scrivi un solo record per dipendente.

    Cambiano spesso le sedi.

    16/11/2024 - sihsandrea ha scritto:


    Progressione lavorativa non so cosa indichi ma a me sembra un sinonimo di carriera.. ergo un altro duplicato.

    Mi fermo qui…

    Le sedi hanno delle sezioni interne, la carriera si riferisce alle qualifiche.

     16/11/2024 - sihsandrea ha scritto:


    Comincia a lavorare sulle due query e mostrale in modo da capire che logica hanno le tabelle che hai mostrato e perché le que sql non si ottengono con un dato comune.

    Fatta la query A e la query B possiamo vedere se si può tentare un select* from A inner join B….

    Se si puoi creare una unica sql select di select.

    Questo è interessante, non conosco questa procedura, metto il codice SQL di entrambe le query.

    Query A:

    SELECT Dipendenti.IdDipendente, Dipendenti.Cognome, Dipendenti.Nome, Dipendenti.DataNascita, Dipendenti.idCittaN, Dipendenti.PrNascita, Dipendenti.idCittaRes, Dipendenti.PrRes, Last(Dipendenti.ViaRes) AS UltimoDiViaRes, Last(Dipendenti.CAPRes) AS UltimoDiCAPRes, Dipendenti.sesso, Dipendenti.dataassunzione, Dipendenti.annipiù, Dipendenti.DecRuoloFunz, Last([Progressione PresaInForza].InizioPiF) AS UltimoDiInizioPiF, [Progressione PresaInForza].FinePiF, [Uffici o Sezioni].Ufficio, qualifiche.qualifica, UltimaQualificaDataDeterminata.UltimoDiMaxDiDecorrenza, UltimaQualificaDataDeterminata.UltimoDiCodQualifica, [Progressione PresaInForza].TipoPiF, [Progressione Lavorativa Decorrenza Determinata].MaxDiDecorrenzaL, UltimaQualificaDataDeterminata.UltimoDiRuolo, qualifiche.CatRuolo, IIf([FinePiF] Is Not Null,[FinePiF],DateSerial((Year([DataNascita])+(IIf([UltimoDiCodQualifica] In (52,53,56,67),65,IIf([UltimoDiCodQualifica] In (51,54,57),63,60)))),(Month([DataNascita])+1),1)) AS [Limiti di età], protocolloMatr2.PerID, IIf([UltimoDiCodQualifica] In (52,53,56,67),65,IIf([UltimoDiCodQualifica] In (51,54,57),63,60)) AS EtaPens, Dipendenti.codfisc, [Uffici o Sezioni].Competenza
    FROM ((((Dipendenti INNER JOIN UltimaQualificaDataDeterminata ON Dipendenti.IdDipendente = UltimaQualificaDataDeterminata.IdDipend) INNER JOIN qualifiche ON UltimaQualificaDataDeterminata.UltimoDiCodQualifica = qualifiche.kqualifica) INNER JOIN [Progressione PresaInForza] ON Dipendenti.IdDipendente = [Progressione PresaInForza].IdDipendPiF) INNER JOIN (([Progressione Lavorativa] INNER JOIN [Progressione Lavorativa Decorrenza Determinata] ON ([Progressione Lavorativa].DecorrenzaL = [Progressione Lavorativa Decorrenza Determinata].MaxDiDecorrenzaL) AND ([Progressione Lavorativa].IdProgDip = [Progressione Lavorativa Decorrenza Determinata].IdProgDip)) INNER JOIN [Uffici o Sezioni] ON [Progressione Lavorativa].CodUfficio = [Uffici o Sezioni].KUfficio) ON Dipendenti.IdDipendente = [Progressione Lavorativa].IdProgDip) INNER JOIN protocolloMatr2 ON Dipendenti.IdDipendente = protocolloMatr2.dipMatr
    GROUP BY Dipendenti.IdDipendente, Dipendenti.Cognome, Dipendenti.Nome, Dipendenti.DataNascita, Dipendenti.idCittaN, Dipendenti.PrNascita, Dipendenti.idCittaRes, Dipendenti.PrRes, Dipendenti.sesso, Dipendenti.dataassunzione, Dipendenti.annipiù, Dipendenti.DecRuoloFunz, [Progressione PresaInForza].FinePiF, [Uffici o Sezioni].Ufficio, qualifiche.qualifica, UltimaQualificaDataDeterminata.UltimoDiMaxDiDecorrenza, UltimaQualificaDataDeterminata.UltimoDiCodQualifica, [Progressione PresaInForza].TipoPiF, [Progressione Lavorativa Decorrenza Determinata].MaxDiDecorrenzaL, UltimaQualificaDataDeterminata.UltimoDiRuolo, qualifiche.CatRuolo, IIf([FinePiF] Is Not Null,[FinePiF],DateSerial((Year([DataNascita])+(IIf([UltimoDiCodQualifica] In (52,53,56,67),65,IIf([UltimoDiCodQualifica] In (51,54,57),63,60)))),(Month([DataNascita])+1),1)), protocolloMatr2.PerID, IIf([UltimoDiCodQualifica] In (52,53,56,67),65,IIf([UltimoDiCodQualifica] In (51,54,57),63,60)), Dipendenti.codfisc, [Uffici o Sezioni].Competenza
    HAVING (((Last([Progressione PresaInForza].InizioPiF))<=[Maschere]![Dipendenti]![DataDeterm]) AND (([Progressione PresaInForza].FinePiF)>=[Maschere]![Dipendenti]![DataDeterm]) AND (([Uffici o Sezioni].Competenza) Between [Maschere]![Dipendenti]![Compet1] And [Maschere]![Dipendenti]![Compet2] And ([Uffici o Sezioni].Competenza)<>[Maschere]![Dipendenti]![Compet3])) OR (((Last([Progressione PresaInForza].InizioPiF))<=[Maschere]![Dipendenti]![DataDeterm]) AND (([Progressione PresaInForza].FinePiF) Is Null) AND ((IIf([FinePiF] Is Not Null,[FinePiF],DateSerial((Year([DataNascita])+(IIf([UltimoDiCodQualifica] In (52,53,56,67),65,IIf([UltimoDiCodQualifica] In (51,54,57),63,60)))),(Month([DataNascita])+1),1)))>=[Maschere]![Dipendenti]![DataDeterm]) AND (([Uffici o Sezioni].Competenza) Between [Maschere]![Dipendenti]![Compet1] And [Maschere]![Dipendenti]![Compet2] And ([Uffici o Sezioni].Competenza)<>[Maschere]![Dipendenti]![Compet3]));

    Query B:

    SELECT QualifichePossedute.IdDipend, Max(QualifichePossedute.Priorità) AS MaxDiPriorità, Last(QualifichePossedute.qualifica) AS UltimoDiqualifica, Last(QualifichePossedute.CodQualifica) AS UltimoDiCodQualifica, Last(QualifichePossedute.QualificaEst) AS UltimoDiQualificaEst, Last(QualifichePossedute.QualificaAbb) AS UltimoDiQualificaAbb, Last(QualifichePossedute.Ruolo) AS UltimoDiRuolo, Last(QualifichePossedute.MaxDiDecorrenza) AS UltimoDiMaxDiDecorrenza
    FROM QualifichePossedute
    WHERE (((QualifichePossedute.MaxDiDecorrenza)<=[Maschere]![Dipendenti]![DQDeterm]))
    GROUP BY QualifichePossedute.IdDipend;

    Query C:

    SELECT [Progressione Lavorativa].IdProgDip, Max([Progressione Lavorativa].DecorrenzaL) AS MaxDiDecorrenzaL
    FROM [Progressione Lavorativa]
    WHERE ((([Progressione Lavorativa].DecorrenzaL) Is Null Or ([Progressione Lavorativa].DecorrenzaL)<=[Maschere]![Dipendenti]![DQDeterm]))
    GROUP BY [Progressione Lavorativa].IdProgDip;
  • Re: Query di raggruppamento e filtro con criteri di campi diversi

    3 query? Vabbè domani le provo.

  • Re: Query di raggruppamento e filtro con criteri di campi diversi

    17/11/2024 - Azucarea ha scritto:


    Cambiano spesso le sedi.

    17/11/2024 - Azucarea ha scritto:


    Le sedi hanno delle sezioni interne, la carriera si riferisce alle qualifiche.

    ti rendi conto che non hai una tabella “sedi” anche se parli di sedi riferito a progressione presa in carico e progressione lavorativa (che già il nomecomposto è un romanzo)?

    la query b select…. from qualifichepossedute… ma non vedo la tabella qualifichepossedute anche se potrei crearla da qualifiche ma sarebbe un lavoro superfluo…

    la query a la sto ancora decifrando….

    17/11/2024 - Azucarea ha scritto:


    Dipendenti INNER JOIN UltimaQualificaDataDeterminata

    ma ndo' sta' la tabella ultimaqualificadeterminata? e cosa sarebbe? l'ultimo record di qualifiche per dipendente? quindi ancora la tabella qualifiche…

    sembra che più che una query hai bisogno di una procedura che ti porti al risultato sperato (e che io non ho capito qual è).

    17/11/2024 - Azucarea ha scritto:


    WHERE ((([Progressione Lavorativa].DecorrenzaL) Is Null

    query c… siamo sicuri che si possa inserire una nuova progressione lavorativa senza data? fai in modo da mettere “now” o una data in cui si prevede la nuova progressione.

    17/11/2024 - Azucarea ha scritto:


    Max([Progressione Lavorativa].DecorrenzaL) AS MaxDiDecorrenzaL

    e vuoi la data ultima anche se null?

    17/11/2024 - Azucarea ha scritto:


    Or ([Progressione Lavorativa].DecorrenzaL)<=[Maschere]![Dipendenti]![DQDeterm]))

    oppure una condizione che cozza con max(progressione…) se hai scritto select max(progressione) non mettere la condizione isnull or progressione = qualcosa… 

    16/11/2024 - OsvaldoLaviosa ha scritto:


    L'immagine mostra una visualizzazione struttura query. In essa non è chiaro quali sono tabelle e quali query. A primo colpo d'occhio ho l'impressione che il database non sia normalizzato.

    non posso che confermare… ci vuole troppo tempo per interpretare la scelta di quella organizzazione di dati.

  • Re: Query di raggruppamento e filtro con criteri di campi diversi

    Potresti però postare il database, cancellando tutti i dati, per rendersi effettivamento conto della struttura dello stesso.

  • Re: Query di raggruppamento e filtro con criteri di campi diversi

    18/11/2024 - Stifone ha scritto:


    Potresti però postare il database, cancellando tutti i dati, per rendersi effettivamento conto della struttura dello stesso.

    anche estrapolando a fatica i campi dalle query non si riesce a capire cosa dovrebbe venir fuori. un minimo di descrizione di cosa contengono le tabelle serve per riuscire a snellire la query. si porta dati ridondanti tra tabelle. 

    sedi che manca è suddivisa tra progressione presa in carico e progressione lavorativa che potrebbero stare in una sola tabella con data inizio che indicherebbe la presa in carico (per citarne una). 

    capisco l'eredità ma io valuterei un rattoppo momentaneo e riscrivere ex novo come versione 2.0. magari con query di riempimento delle nuove tabelle normalizzate che attinge ai dati in essere.

  • Re: Query di raggruppamento e filtro con criteri di campi diversi

    17/11/2024 - Azucarea ha scritto:


    INNER JOIN (([Progressione Lavorativa] INNER JOIN [Progressione Lavorativa Decorrenza Determinata]

    da query a

    17/11/2024 - Azucarea ha scritto:


    SELECT [Progressione Lavorativa].IdProgDip, Max([Progressione Lavorativa].DecorrenzaL) AS MaxDiDecorrenzaL FROM [Progressione Lavorativa] WHERE ((([Progressione Lavorativa].DecorrenzaL

    che riprendi in query c… 

    filtrarlo direttamente in query a è possibile? boh! mancano dati di esempio per poter valutare.

Devi accedere o registrarti per scrivere nel forum
13 risposte