Join su due tabelle

di il
3 risposte

Join su due tabelle

Buonasera a tutti

ho due tabelle su MS SQL:

Personale(dipendente, mese, costo) dove la chiave è dipendente & mese, perchè ogni mese un dipendente ha costi diversi

EffortNorm(dipendente, divisione, effort) dove la chiave è dipendente & divisione, perchè ogni dipendente per mansionario deve dedicare una percentuale del proprio tempo a divisioni diverse. Per es il dipendente 1 sta il 40% del tempo in amministrazione e il 60% in produzione.

Dovrei fare una vista/query che ribalti il costo mensile di ciascun dipendente su ciascun dipartimento, in percentuale.

Quindi per ogni coppia dipendente - mese vorrei i vari dipartimenti con il prodotto effort % per costo mensile dipendente.

Se tento di creare la vista con gli strumenti di SQL mi propone un cross join, che non è quello che voglio.

SELECT dbo.Personale.[CODICE DIPENDENTE], dbo.Personale.MESE, dbo.EffortNorm.Divisione, dbo.EffortNorm.Effort * dbo.Personale.[TOTALE COSTO] AS [costo per dipartimento]
FROM   dbo.EffortNorm CROSS JOIN  dbo.Personale

Sono però riuscito a ottenere quello che voglio creando una pivot della tabella EffortNorm, dove per ogni valore di Divisione ho una colonna con l'effort e il costo corrispondente. Questa soluzione non è pratica perchè Divisione non è più una variabile su cui poi posso fare delle tabelle pivot. Inoltre, la tabella pivot di appoggio ha tante colonne quante le divisioni aziendali (tante).

Potete aiutarmi? Grazie

3 Risposte

  • Re: Join su due tabelle

    Sbagliato sia nella progettazione delle tabelle che della suddivisione del lavoro.

    Quando vieni assunto puoi ricoprire solo un lavoro. Se sei di concetto (ufficio) non sei operaio.

    Se svolgi una mansione “inferiore” (l'operaio ha paga giornaliera, l'impiegato mensile) e il dipendente va nel più cretino CAF scatta il mobbing.

    Se un operaio lo metti in viaa continuativa ad una mansione “superiore” scatta il livello (sempre ad opera del più cretino CAF).

    Saltata la premessa, le tabelle sono totalmente sbagliate. Quale esempio migliore di un impiegato messo a fare l'operaio ed un ooeraio messo a fare l'impiegato, come uno che non è programmatore e vuole realizzare un gestionale.

    Non puoi mettere dipendente e mese come chiave. 

    Dovresti avere un archivio dipendenti, un archivio ccnl (anche se di questo tipo non ne esistono), una tabella presenze, una tabella salariestipendi e altre ancora…

  • Re: Join su due tabelle

    Mi pare ti sia sufficiente una LEFT JOIN… O mi perdo qualcosa?

    SELECT
    	P.[CODICE DIPENDENTE],
    	P.MESE,
    	EN.Divisione,
    	EN.Effort * P.[TOTALE COSTO] AS [costo per dipartimento]
    FROM
    	dbo.EffortNorm EN
    LEFT JOIN  dbo.Personale P ON P.[CODICE DIPENDENTE] = EN.[CODICE DIPENDENTE]
    WHERE
    	EN.Divisione = 'amministrazione'
    AND P.MESE = 'Luglio'

    Così fai coincidere ogni Effort con il relativo dipendente e poi filtri solo il mese e la divisione che ti interessano.

    Partendo da qui, aggreghi ancora per come ti serve.

  • Re: Join su due tabelle

    13/07/2023 - Sgrubak ha scritto:


    Mi pare ti sia sufficiente una LEFT JOIN… O mi perdo qualcosa?

    SELECT
    	P.[CODICE DIPENDENTE],
    	P.MESE,
    	EN.Divisione,
    	EN.Effort * P.[TOTALE COSTO] AS [costo per dipartimento]
    FROM
    	dbo.EffortNorm EN
    LEFT JOIN  dbo.Personale P ON P.[CODICE DIPENDENTE] = EN.[CODICE DIPENDENTE]
    WHERE
    	EN.Divisione = 'amministrazione'
    AND P.MESE = 'Luglio'

    Così fai coincidere ogni Effort con il relativo dipendente e poi filtri solo il mese e la divisione che ti interessano.

    Partendo da qui, aggreghi ancora per come ti serve.

    Grazie, non è esattamente così, perchè vorrei il costo (moltiplicato per l'effort) per ogni dipendente per ogni divisione per ogni mese. Quindi tolgo le condizioni where. Ci sto provando, poi nel caso ti aggiorno. Grazie mille 

Devi accedere o registrarti per scrivere nel forum
3 risposte