Vista complicata

martedì 25 maggio 2010 - 08.48

Bolo Profilo | Junior Member

Ciao a tutti... Sono nuovo, vi illustro la mia questione sperando di essere chiaro:

Tabella 1: dipendente + sede + turno
Tabella 2: ora inizio turno oppure ora fine turno + codice che definisce se la riga identifica l'ora di inizio o quella di fine turno + turno

Vorrei fare una vista che mi unisca le due tabelle però non riesco a mettere sulla stessa riga in due colonne diverse l'ora di inizio e quella di fine.
Praticamente mi servirebbe una condizione if sul contenuto delle colonne, ma non so come fare...

Grazie

lbenaglia Profilo | Guru

>Ciao a tutti... Sono nuovo, vi illustro la mia questione sperando
>di essere chiaro:
>
>Tabella 1: dipendente + sede + turno
>Tabella 2: ora inizio turno oppure ora fine turno + codice che
>definisce se la riga identifica l'ora di inizio o quella di fine
>turno + turno
>
>Vorrei fare una vista che mi unisca le due tabelle però non riesco
>a mettere sulla stessa riga in due colonne diverse l'ora di inizio
>e quella di fine.
>Praticamente mi servirebbe una condizione if sul contenuto delle
>colonne, ma non so come fare...

Ciao Maurizio,

Posta i comandi di CREATE TABLE comprensivi di constraints, alcune righe di prova (INSERT INTO) ed il result set finale che intendi ottenere con quei dati.

>Grazie
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

Bolo Profilo | Junior Member

Intanto grazie per la risposta... ti incollo il codice di creazione della tabella e aggiunta di una riga... la cosa più difficile per me è spiegare cosa voglio fare, spero questo pezzo di codice posso aiutare...
Castigatemi se chiedo cose astruse...

CREATE TABLE _CUST_REPORT
(CODICE nvarchar(30),
SEDE nvarchar(30),
OPERATORE nvarchar(30),
DESCRIZIONE nvarchar(200),
INGRESSO datetime,
USCITA datetime)

DECLARE @CODICE nvarchar(30)
DECLARE @SEDE nvarchar(30)
DECLARE @OPERATORE nvarchar(30)
DECLARE @DESCRIZIONE nvarchar(200)
DECLARE @IN datetime
DECLARE @OUT datetime


SELECT @CODICE=EVT_CODE,
@DESCRIZIONE=EVT_DESC,
@SEDE=EVT_OBJECT,
@OPERATORE=EVT_PERSON,
@IN=PRV_DVALUE

FROM R5EVENTS

INNER JOIN R5PROPERTYVALUES
ON EVT_PPM = LEFT(PRV_CODE, 7)
WHERE (EVT_TYPE = 'PPM' or EVT_TYPE = 'JOB') AND EVT_STATUS = 'C' AND PRV_PROPERTY = 'UTNBEG'

INSERT INTO _CUST_REPORT (CODICE, SEDE, OPERATORE, DESCRIZIONE, INGRESSO, USCITA)
VALUES (@CODICE, @SEDE, @OPERATORE, @DESCRIZIONE, @IN, @OUT)

lbenaglia Profilo | Guru

>Intanto grazie per la risposta... ti incollo il codice di creazione
>della tabella e aggiunta di una riga...
Mancano i comandi di CREATE TABLE (COMPRENSIVI DI CONSTRAINTS!!) delle altre 2 tabelle, una manciata di comandi di INSERT per ogni tabella ed il result set finale che intendi ottenere con quei dati.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

Bolo Profilo | Junior Member

Perdonami ma forse non mi sono spiegato.
Io ho già tutte le tabelle (fanno parte di un software di gestione di asset aziendali).
Il mio problema è creare una vista da due tabelle una collegata all'altra affiancando, tramite un inner join (o qualche altra funzionalità a me sconosciuta) , a ogni record della prima tabella due colonne contenenti ognuna un record della seconda tabella.
Se non è chiaro provo a fare un grafico delle relazioni, non saprei come fare altirmenti...



Ciao ciao!

lbenaglia Profilo | Guru

>Perdonami ma forse non mi sono spiegato.
>Io ho già tutte le tabelle (fanno parte di un software di gestione
>di asset aziendali).
Si, ma noi no
Se non posti i dati che ti ho chiesto dubito che riusciremo ad esserti di aiuto.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

Bolo Profilo | Junior Member

Alle tante... credo di aver capito le vostre intenzioni
Ho provato a ricreare l'ambiente simile a quello che utilizzo in realtà...
Il problema è che nella vista le righe sono giustamente doppie; vorrei che l'ora di uscita apparisse a fianco di quella di entrata per capirci...
Ce la faranno i nostri eroi? mah
Di seguito il codice... se si può definire tale...


-- Creo e popolo la tabella dei turni

CREATE TABLE TURNI (
ID INTEGER CONSTRAINT id_turno UNIQUE,
NOME NVARCHAR(10) NOT NULL,
COGNOME NVARCHAR(10) NOT NULL)

INSERT INTO
TURNI (ID, NOME, COGNOME)
VALUES
(1, 'Paolo', 'Rossi')

INSERT INTO
TURNI (ID, NOME, COGNOME)
VALUES
(2, 'Mario', 'Bianchi')

INSERT INTO
TURNI (ID, NOME, COGNOME)
VALUES
(3, 'GIovanni', 'Verdi')

-- Creo e popolo la tabella delle timbrature

CREATE TABLE ORARI (
ID INTEGER NOT NULL,
IN_OUT NVARCHAR(3) NOT NULL,
ORA DATETIME NOT NULL)

INSERT INTO
ORARI (ID, IN_OUT, ORA)
VALUES
(1, 'IN', 'mag 25 2010 8:00PM')

INSERT INTO
ORARI (ID, IN_OUT, ORA)
VALUES
(1, 'OUT', 'mag 25 2010 9:00PM')

INSERT INTO
ORARI (ID, IN_OUT, ORA)
VALUES
(2, 'IN', 'mag 25 2010 2:00PM')

INSERT INTO
ORARI (ID, IN_OUT,ORA)
VALUES
(2, 'OUT', 'mag 25 2010 4:00PM')

INSERT INTO
ORARI (ID, IN_OUT, ORA)
VALUES
(3, 'IN', 'mag 25 2010 7:00PM')

INSERT INTO
ORARI (ID, IN_OUT, ORA)
VALUES
(3, 'OUT', 'mag 25 2010 8:00PM')

-- Creo la vista

CREATE VIEW REPORT
AS
SELECT
TURNI.ID,
TURNI.NOME,
TURNI.COGNOME,
ORARI.ORA
FROM
TURNI INNER JOIN
ORARI ON TURNI.ID = ORARI.ID

lbenaglia Profilo | Guru

>Alle tante... credo di aver capito le vostre intenzioni
>Ho provato a ricreare l'ambiente simile a quello che utilizzo
>in realtà...
OK. Se per ogni ID, NOME e COGNOME esiste solo una coppia di ingressi ed uscite, allora puoi utilizzare una query simile a questa:

SELECT T.ID , T.NOME , T.COGNOME , MIN(O.ORA) AS INGRESSO , MAX(O.ORA) AS USCITA FROM dbo.TURNI AS T JOIN dbo.ORARI AS O ON T.ID = O.ID GROUP BY T.ID , T.NOME , T.COGNOME; /* Output: ID NOME COGNOME INGRESSO USCITA ----------- ---------- ---------- ----------------------- ----------------------- 1 Paolo Rossi 2010-05-25 20:00:00.000 2010-05-25 21:00:00.000 2 Mario Bianchi 2010-05-25 14:00:00.000 2010-05-25 16:00:00.000 3 GIovanni Verdi 2010-05-25 19:00:00.000 2010-05-25 20:00:00.000 (3 row(s) affected) */

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

Bolo Profilo | Junior Member

Caspita... è quello che si dice un barbatrucco...

Domani lo provo sul campo, intanto ti ringrazio!!!

Bolo Profilo | Junior Member

Funziona tutto alla perfezione esattamente come serviva a me... grazie!!!!

Senza aprire un altro post visto che sarà una cavolata... come mai questa select non mi da come risultato un numero con la virgola!?!?!?

DECLARE @H1 decimal
SELECT @H1 = 60/23
PRINT @H1

lbenaglia Profilo | Guru

>Senza aprire un altro post visto che sarà una cavolata... come
>mai questa select non mi da come risultato un numero con la virgola!?!?!?
>
>DECLARE @H1 decimal
>SELECT @H1 = 60/23
>PRINT @H1

Perché la divisione tra due numeri interi restituisce un intero.
Assegnando un valore intero da una variabile decimal, avrai un decimal privo di decimali dato che un intero per definizione non ha decimali

Per ottenere la parte decimale è sufficiente che il numeratore, il denominatore o entrambi siano decimali:

DECLARE @H1 decimal(3,2); SELECT @H1 = 60.0/23; PRINT @H1; /* Output: 2.61 */

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

Bolo Profilo | Junior Member

Fantastico... Chiarissimo, supponevo fosse quello, ma la soluzione pensavo fosse convertire il risultato (chiaramente non ci riuscivo )

Mi sto cimentando nel suddividere le ore di turno in festive, feriali, diurne e notturne, verranno pagine e pagine di codice, speriamo bene... :)

Grazie ancora davvero, spero di poter fornire anche io qualche piccolo apporto per il forum in futuro
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5