none
Visualizzazione tabella RRS feed

  • Domanda

  • Ciao a tutti,

    devo estrarre da un db MSSQL una tabella che riporta i seguenti dati:

    Data | Turno | Inizio | Fine | Collaboratore

    I dati provengono da due tabelle:

    • dbo.tipoturni (che mi fornisce: idtipoturno, turno, inizio, fine)
    • dbo.taskassegnati (che mi fornisce: data, idtipoturno, collaboratore)

    Se faccio una classica view con le due tabelle mi fa vedere tutti i turni "assegnati" in ordine che scelgo io nella query. Quello che avrei bisogno io è che mi faccia vedere una tabella con obbligatoriamente tutti i turni anche quelli che non hanno un riferimento in "dbo.taskassegnati", come nel seguente esempio:

    Data | Turno | Inizio | Fine | Collaboratore

    1.4.20 | 1 | 7:00 | 19:00 | Pinco Pallino

    1.4.20 | 2 | 19:00 | 07:00 |

    1.4.20 | 3 | 7:00 | 15:00 | Tizio Caio

    È possibile farlo in SQL? Come posso fare?

    CIao e grazie per i suggerimenti

    Mauro

    mercoledì 1 aprile 2020 05:45

Risposte

  • Ciao Mauro,

    se ho capito bene la tua richiesta, vorresti arrivare ad un risultato di questo tipo dove, per ogni giorno e per ogni turno vedi l'allocazione delle risorse mostrando però anche i turni eventualmente vuoti:

    Per farlo hai bisogno di una tabella aggiuntiva che chiamiamo dbo.calendario con un campo [data] nella quale andrai a definire appunto i giorni in cui i turni saranno presenti.


    Infine, questa è la query che ho scritto per ottenere il risultato finale:

    ;WITH cte as
    (
    	--genera tutte le combinazioni tra tipoturni e calendario
    	SELECT 
    		c.[data]
    		, tt.idtipoturno
    		, tt.Turno
    		, tt.inizio
    		, tt.Fine
    	FROM dbo.tipoturni tt
    	CROSS JOIN dbo.Calendario c
    )
    --assegna i task ad ogni turno se presenti (LEFT JOIN)
    SELECT
    	cte.[data]
    	, cte.Turno
    	, cte.Inizio
    	, cte.Fine
    	, ta.collaboratore
    FROM cte
    LEFT OUTER JOIN [dbo].[taskassegnati] ta ON ta.[data] = cte.[data] AND ta.idTipoTurno = cte.idtipoturno
    ORDER BY cte.[data], cte.Turno
    



    HTH,

    Cristiano Gasparotto, MCSE Data Management and Analytics

    You can find me working hard every day at Datamaze!

    Please Mark This As Answer if it solved your issue or Vote This As Helpful if it helps to solve your issue. Thank you!

    mercoledì 1 aprile 2020 07:05

Tutte le risposte

  • Ciao Mauro,

    se ho capito bene la tua richiesta, vorresti arrivare ad un risultato di questo tipo dove, per ogni giorno e per ogni turno vedi l'allocazione delle risorse mostrando però anche i turni eventualmente vuoti:

    Per farlo hai bisogno di una tabella aggiuntiva che chiamiamo dbo.calendario con un campo [data] nella quale andrai a definire appunto i giorni in cui i turni saranno presenti.


    Infine, questa è la query che ho scritto per ottenere il risultato finale:

    ;WITH cte as
    (
    	--genera tutte le combinazioni tra tipoturni e calendario
    	SELECT 
    		c.[data]
    		, tt.idtipoturno
    		, tt.Turno
    		, tt.inizio
    		, tt.Fine
    	FROM dbo.tipoturni tt
    	CROSS JOIN dbo.Calendario c
    )
    --assegna i task ad ogni turno se presenti (LEFT JOIN)
    SELECT
    	cte.[data]
    	, cte.Turno
    	, cte.Inizio
    	, cte.Fine
    	, ta.collaboratore
    FROM cte
    LEFT OUTER JOIN [dbo].[taskassegnati] ta ON ta.[data] = cte.[data] AND ta.idTipoTurno = cte.idtipoturno
    ORDER BY cte.[data], cte.Turno
    



    HTH,

    Cristiano Gasparotto, MCSE Data Management and Analytics

    You can find me working hard every day at Datamaze!

    Please Mark This As Answer if it solved your issue or Vote This As Helpful if it helps to solve your issue. Thank you!

    mercoledì 1 aprile 2020 07:05
  • Ciao Mauro,

    se ho capito bene la tua richiesta credo che tu abbia bisogno di questa query:

    select ta.data, tt.turno, tt.inizio, tt.fine, ta.collaboratore
    from dbo.tipoturni as tt
    left join dbo.taskassegnati as ta on tt.idtipoturno=ta.idtipoturno
    order by ta.data,tt.turno

    Usando la "left join" invece della "inner join", o anche "join" senza "inner", tutti i records della tabella a sinistra (dbo.tipoturni) vengono estratti a prescindere dall'esistenza di record corrispondenti nell'altra tabella.

    In questo caso è fondamentale che non vengano usati campi della seconda tabella in una eventuale condizione di Where (che qui manca): in tal caso, fatte salve eccezioni specifiche, l'operatore "left join" si comporterebbe esattamente come una "inner join".

    G.

    mercoledì 1 aprile 2020 09:19