Principale utente con più risposte
Visualizzazione tabella

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
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!
- Contrassegnato come risposta Edoardo BenussiMVP, Moderator lunedì 6 aprile 2020 07:29
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!
- Contrassegnato come risposta Edoardo BenussiMVP, Moderator lunedì 6 aprile 2020 07:29
-
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.