13 messaggi dal 18 novembre 2004
Ciao a tutti,
spero di poter riassumere in poche righe il mio problema.
Ho una tabella di un db Sql Server 2000 per la gestione dei turni di operatori di Call Center con i seguenti campi:

pk_turno (Primary Key)
fk_utente (Chiavi di riferimento della tabella utenti)
data_turno (SmallDateTime)
ora_inizio (TinyInt)
ora_fine (TinyInt)

Ovviamente ogni record corrisponde al turno di un giorno di un determinato utente.
I turni inseriti (controllo dell'applicativo) sono sempre per blocchi settimanali sul singolo utente (avrò sempre multipli di 7 record per utente)

Il problema è proprio che TUTTE le visualizzazioni da interfaccia dell'applicativo sono per spaccato settimanale, quindi nella situazione più semplice avrò una tabella html a video che su ogni riga riporterà il nome dell'operatore e le sette colonne che vanno dal lunedì alla domenica di una determinata settimana selezionata da un filtro.

La domanda è questa: come posso costruire una vista/stored che mi restituisce i dati in questo formato?

la soluzione di annidare tante subquery in una generica è poco "performante"
C'è una soluzione nel linguaggio SQL per invertire i dati restituiti da una query da verticale a orizzontale?
1.976 messaggi dal 27 luglio 2005
Contributi
salve,
tetuccio ha scritto:
Ciao a tutti,
spero di poter riassumere in poche righe il mio problema.
Ho una tabella di un db Sql Server 2000 per la gestione dei turni di operatori di Call Center con i seguenti campi:

pk_turno (Primary Key)
fk_utente (Chiavi di riferimento della tabella utenti)
data_turno (SmallDateTime)
ora_inizio (TinyInt)
ora_fine (TinyInt)

Ovviamente ogni record corrisponde al turno di un giorno di un determinato utente.
I turni inseriti (controllo dell'applicativo) sono sempre per blocchi settimanali sul singolo utente (avrò sempre multipli di 7 record per utente)

Il problema è proprio che TUTTE le visualizzazioni da interfaccia dell'applicativo sono per spaccato settimanale, quindi nella situazione più semplice avrò una tabella html a video che su ogni riga riporterà il nome dell'operatore e le sette colonne che vanno dal lunedì alla domenica di una determinata settimana selezionata da un filtro.

La domanda è questa: come posso costruire una vista/stored che mi restituisce i dati in questo formato?

la soluzione di annidare tante subquery in una generica è poco "performante"
C'è una soluzione nel linguaggio SQL per invertire i dati restituiti da una query da verticale a orizzontale?



intendi qualche cosa simile a quanto sotto?
SET NOCOUNT ON;
USE tempdb;
GO
CREATE TABLE dbo.Utenti (
pk_utente int NOT NULL IDENTITY PRIMARY KEY,
Nome varchar(10) NOT NULL
);
CREATE TABLE dbo.Turni (
pk_turno int NOT NULL IDENTITY PRIMARY KEY,
fk_utente int NOT NULL
CONSTRAINT fk_Turni_Utenti
REFERENCES dbo.Utenti (pk_utente),
data_turno smalldatetime NOT NULL,
ora_inizio tinyint NOT NULL DEFAULT 8,
ora_fine tinyint NOT NULL DEFAULT 16
);
GO
INSERT INTO dbo.Utenti VALUES ( 'Tetuccio' );
INSERT INTO dbo.Utenti VALUES ( 'Andrea' );

INSERT INTO dbo.Turni VALUES ( 1 , '20060605', DEFAULT, DEFAULT );
INSERT INTO dbo.Turni VALUES ( 1 , '20060606', DEFAULT, DEFAULT );
INSERT INTO dbo.Turni VALUES ( 1 , '20060607', DEFAULT, DEFAULT );
INSERT INTO dbo.Turni VALUES ( 1 , '20060608', DEFAULT, DEFAULT );
INSERT INTO dbo.Turni VALUES ( 1 , '20060609', DEFAULT, DEFAULT );
INSERT INTO dbo.Turni VALUES ( 1 , '20060610', DEFAULT, DEFAULT );
INSERT INTO dbo.Turni VALUES ( 1 , '20060611', DEFAULT, DEFAULT );

INSERT INTO dbo.Turni VALUES ( 2 , '20060605', 9, 17 );
INSERT INTO dbo.Turni VALUES ( 2 , '20060606', DEFAULT, DEFAULT );
INSERT INTO dbo.Turni VALUES ( 2 , '20060607', 10, 18 );
INSERT INTO dbo.Turni VALUES ( 2 , '20060608', DEFAULT, DEFAULT );
INSERT INTO dbo.Turni VALUES ( 2 , '20060609', 9, 17 );
INSERT INTO dbo.Turni VALUES ( 2 , '20060610', DEFAULT, DEFAULT );
INSERT INTO dbo.Turni VALUES ( 2 , '20060611', 7, 15 );
GO
DECLARE @df int;
SELECT @df = @@DATEFIRST;
SET DATEFIRST 1;

SELECT u.Nome,
MAX( CASE WHEN DATEPART(dw, t.data_turno) = 1 THEN CONVERT(char(2), t.ora_inizio) + ' - ' + CONVERT(char(2), t.ora_fine) ELSE '' END ) AS [Lunedì] ,
MAX( CASE WHEN DATEPART(dw, t.data_turno) = 2 THEN CONVERT(char(2), t.ora_inizio) + ' - ' + CONVERT(char(2), t.ora_fine) ELSE '' END ) AS [Martedì] ,
MAX( CASE WHEN DATEPART(dw, t.data_turno) = 3 THEN CONVERT(char(2), t.ora_inizio) + ' - ' + CONVERT(char(2), t.ora_fine) ELSE '' END ) AS [Mercoledì] ,
MAX( CASE WHEN DATEPART(dw, t.data_turno) = 4 THEN CONVERT(char(2), t.ora_inizio) + ' - ' + CONVERT(char(2), t.ora_fine) ELSE '' END ) AS [Giovedì] ,
MAX( CASE WHEN DATEPART(dw, t.data_turno) = 5 THEN CONVERT(char(2), t.ora_inizio) + ' - ' + CONVERT(char(2), t.ora_fine) ELSE '' END ) AS [Venerdì] ,
MAX( CASE WHEN DATEPART(dw, t.data_turno) = 6 THEN CONVERT(char(2), t.ora_inizio) + ' - ' + CONVERT(char(2), t.ora_fine) ELSE '' END ) AS [Sabato] ,
MAX( CASE WHEN DATEPART(dw, t.data_turno) = 7 THEN CONVERT(char(2), t.ora_inizio) + ' - ' + CONVERT(char(2), t.ora_fine) ELSE '' END ) AS [Domenica]
FROM dbo.Turni t JOIN dbo.Utenti u
ON t.fk_utente = u.pk_utente
GROUP BY DATEPART(wk, t.data_turno), u.nome;

IF @df <> @@DATEFIRST
SET DATEFIRST @df ;
GO
DROP TABLE dbo.Turni, dbo.Utenti;
--<------------------
Nome Lunedì Martedì Mercoledì Giovedì Venerdì Sabato Domenica
---------- ------- ------- --------- ------- ------- ------- --------
Andrea 9 - 17 8 - 16 10 - 18 8 - 16 9 - 17 8 - 16 7 - 15
Tetuccio 8 - 16 8 - 16 8 - 16 8 - 16 8 - 16 8 - 16 8 - 16

saluti

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php
13 messaggi dal 18 novembre 2004
E' un'ottima soluzione, anche le performance, con la mole di dati contenuta nelle tabelle, sono buone.

Grazie!!!

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.