Home Page
Articoli
Tips & Tricks
News
Forum
Archivio Forum
Blogs
Sondaggi
Rss
Video
Utenti
Chi Siamo
Contattaci
Username:
Password:
Login
Registrati ora!
Recupera Password
Home Page
Stanze Forum
SQL Server 2000/2005/2008, Express, Access, MySQL, Oracle
Vista con raggruppamento di record
venerdì 04 giugno 2010 - 12.14
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
Bolo
Profilo
| Junior Member
58
messaggi | Data Invio:
ven 4 giu 2010 - 12:14
Ho una vista con elencati una serie di turni giorno per giorno, mi spiego meglio.
Lo stesso turno si ripete ogni giorno dal lunedì al venerdì, e per ogni giorno ho un record con i seguenti campi:
CODICE - DESCRIZIONE - SEDE - INIZIO - FINE
978x348
127Kb
Vorrei creare una vista dove quando ho le seguenti condizioni mi inserisce un solo record al posto di tutti i record di quella settimana di turno:
* Prime 4 lettere e ultime 2 del codice sono uguali;
* Campo ora inizio sempre uguale;
* Campo ora fine sempre uguale.
Ma non so proprio da dove cominciare
dinoxet
Profilo
| Senior Member
484
messaggi | Data Invio:
ven 4 giu 2010 - 12:23
CIAO
PROVA COSì
SELECT LEFT(CODICE,4) AS INIZIO_CODICE, RIGHT(CODICE,2) AS FINE_CODICE, INIZIO, FINE
FROM TABELLA
GROUP BY LEFT(CODICE,4) AS INIZIO_CODICE, RIGHT(CODICE,2) AS FINE_CODICE, INIZIO, FINE
>* Prime 4 lettere e ultime 2 del codice sono uguali;
>* Campo ora inizio sempre uguale;
>* Campo ora fine sempre uguale.
DINOXET
__________________________________________
impossible is only a word
GruppoETD
Profilo
| Newbie
21
messaggi | Data Invio:
ven 4 giu 2010 - 13:38
Dovrebbe funzionare anche cosi
SELECT DISTINCT top 100% LEFT(CODICE,4) + RIGHT(CODICE,2) AS CODICE, INIZIO, FINE
FROM TABELLA
Bolo
Profilo
| Junior Member
58
messaggi | Data Invio:
ven 4 giu 2010 - 13:38
Grazie, funziona:
IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[CUST_TURNI]'))
DROP VIEW [dbo].[CUST_TURNI]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER OFF
GO
CREATE VIEW [dbo].[CUST_TURNI]
(CODICE, DESCRIZIONE, SEDE, INIZIO, FINE)
AS
SELECT LEFT(CODICE,4)+ '#' + RIGHT(CODICE,2) , null, SEDE, INIZIO, FINE
FROM dbo.CUST_TURNISTICA
GROUP BY LEFT(CODICE,4), RIGHT(CODICE,2), SEDE, INIZIO, FINE
715x287
69Kb
Mancherebbe solo un passaggio (forse il più difficile), ovvero scrivere nella descrizione i giorni in cui il turno effettuato tramite una condizione del tipo:
Se i turni raggruppati hanno la "SUBSTRING (5,1)" = 1, 2, 3 allora la descrizione sarà 'Turno da lunedì a mercoledì'
Se i turni raggruppati hanno la "SUBSTRING (5,1)" = 1, 2, 3, 4, 5, 6, 7 allora la descrizione sarà 'Turno da lunedì a domenica'
GruppoETD
Profilo
| Newbie
21
messaggi | Data Invio:
ven 4 giu 2010 - 14:07
>Grazie, funziona:
>
>IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[CUST_TURNI]'))
>DROP VIEW [dbo].[CUST_TURNI]
>GO
>SET ANSI_NULLS ON
>GO
>SET QUOTED_IDENTIFIER OFF
>GO
>
>CREATE VIEW [dbo].[CUST_TURNI]
>
>(CODICE, DESCRIZIONE, SEDE, INIZIO, FINE)
>
>AS
>
>SELECT LEFT(CODICE,4)+ '#' + RIGHT(CODICE,2) , null, SEDE, INIZIO,
>FINE
>FROM dbo.CUST_TURNISTICA
>GROUP BY LEFT(CODICE,4), RIGHT(CODICE,2), SEDE, INIZIO, FINE
>
>
>
>Mancherebbe solo un passaggio (forse il più difficile), ovvero
>scrivere nella descrizione i giorni in cui il turno effettuato
>tramite una condizione del tipo:
>
>Se i turni raggruppati hanno la "SUBSTRING (5,1)" = 1, 2, 3
>allora la descrizione sarà 'Turno da lunedì a mercoledì'
>Se i turni raggruppati hanno la "SUBSTRING (5,1)" = 1, 2, 3,
>4, 5, 6, 7 allora la descrizione sarà 'Turno da lunedì a domenica'
>
Secondo me potresti fare in due modi:
1 - select Codice, funzione(codice), inizio, fine
dove la funzione si crea la stringa con i giorni
2 - select Codice,
sum(case when patindex('luned',Descrizione) > 0 then 1 else 0 end +
case when patindex('marted',Descrizione> 0) then 20 else 0 end +
case when patindex('mercoled',Descrizione> 0) then 300 else 0 end +
case when patindex('gioved',Descrizione> 0) then 4000 else 0 end +
case when patindex('venerd',Descrizione> 0) then 50000 else 0 end +
case when patindex('sabato',Descrizione> 0) then 600000 else 0 end +
case when patindex('domenica',Descrizione> 0) then 700000 else 0 end) as 'Descrizione', Inizio, Fine
from Tabella
group by Codice, Inizio, Fine
Probabilmente la seconda non è sintatticamente corrette perchè non l'ho provata ma dovrebbe funzionare.
Rileggendo il tuo post se vuoi ottenere "Turno da un giorno ad un Altro" meglio fare il primo modo.
Bolo
Profilo
| Junior Member
58
messaggi | Data Invio:
ven 4 giu 2010 - 14:09
Grazie... mi hai instradato mentalmente verso la soluzione... se riesco più tardi posto il risultato!!!
Buon pomeriggio intanto
dinoxet
Profilo
| Senior Member
484
messaggi | Data Invio:
ven 4 giu 2010 - 14:12
prova così :
SELECT LEFT(CODICE,4)+ '#' + RIGHT(CODICE,2) , case when "SUBSTRING (5,1)" in('1','2','3') then 'Turno da lunedì a mercoledì' when "SUBSTRING (5,1)" in('1','2','3','4','5','6','7') then 'Turno da lunedì a domenica' end as descrizione, SEDE, INIZIO, FINE
FROM dbo.CUST_TURNISTICA
GROUP BY LEFT(CODICE,4), RIGHT(CODICE,2), case when "SUBSTRING (5,1)" in('1','2','3') then 'Turno da lunedì a mercoledì' when "SUBSTRING (5,1)" in('1','2','3','4','5','6','7') then 'Turno da lunedì a domenica' end as descrizione,SEDE, INIZIO, FINE
più o meno
DINOXET
__________________________________________
impossible is only a word
Bolo
Profilo
| Junior Member
58
messaggi | Data Invio:
ven 4 giu 2010 - 15:32
Ho provato con l'ultimo metodo però testando come di seguito mi mette il testo 'Venerdì' in tutti i "gruppi di record" che contengono almeno un codice con il numero 5, mentre dovrebbe mettere venerdì solo se tutti i record i quel gruppo contengono il 5... ho provato a sostituire l'IN con l' = ma non cambia nulla...
CREATE VIEW [dbo].[CUST_TURNI]
(CODICE,
DESCRIZIONE,
SEDE,
INIZIO,
FINE)
AS
SELECT LEFT(CODICE,4)+ '#' + RIGHT(CODICE,2),
CASE
when SUBSTRING (CODICE,5,1) in ('5') then 'Venerdì'
END,
SEDE,
INIZIO,
FINE
FROM dbo.CUST_TURNISTICA
GROUP BY LEFT(CODICE,4), RIGHT(CODICE,2), SEDE, INIZIO, FINE,
CASE
when SUBSTRING (CODICE,5,1) in ('5') then 'Venerdì'
END
GruppoETD
Profilo
| Newbie
21
messaggi | Data Invio:
ven 4 giu 2010 - 15:47
>Ho provato con l'ultimo metodo però testando come di seguito
>mi mette il testo 'Venerdì' in tutti i "gruppi di record" che
>contengono almeno un codice con il numero 5, mentre dovrebbe
>mettere venerdì solo se tutti i record i quel gruppo contengono
>il 5... ho provato a sostituire l'IN con l' = ma non cambia nulla...
>
>CREATE VIEW [dbo].[CUST_TURNI]
>
>(CODICE,
>DESCRIZIONE,
>SEDE,
>INIZIO,
>FINE)
>
>AS
>
>SELECT LEFT(CODICE,4)+ '#' + RIGHT(CODICE,2),
>
>CASE
> when SUBSTRING (CODICE,5,1) in ('5') then 'Venerdì'
>END,
>
> SEDE,
> INIZIO,
> FINE
>FROM dbo.CUST_TURNISTICA
>GROUP BY LEFT(CODICE,4), RIGHT(CODICE,2), SEDE, INIZIO, FINE,
>
> CASE
> when SUBSTRING (CODICE,5,1) in ('5') then 'Venerdì'
>END
Non è semplice questo metodo.. sarebbe + semplice fare con il primo metodo con una funziona apposita.
Seguendo la strada più complessa si potrebbe fare una serie di UNION, mi spiego meglio
CREATE VIEW....
select CODICE, 'Lunedì', SEDE, INIZIO, FINE
WHERE Substring(Codice,5,1) = '1'
group by Codice,Sede,Inizio,Fine
union
select CODICE, 'Martedì', SEDE, INIZIO, FINE
WHERE Substring(Codice,5,1) = '2'
group by Codice,Sede,Inizio,Fine
ecc...
Bolo
Profilo
| Junior Member
58
messaggi | Data Invio:
ven 4 giu 2010 - 16:32
Ho provato così:
SELECT LEFT(CODICE,4)+ '#' + RIGHT(CODICE,2),
CASE
WHEN SUM (CONVERT(INT,Substring(Codice,5,1)))= '6' THEN 'Sabato'
WHEN SUM (CONVERT(INT,Substring(Codice,5,1)))= '7' THEN 'Domenica'
WHEN SUM (CONVERT(INT,Substring(Codice,5,1)))= '5' THEN 'Venerdì'
WHEN SUM (CONVERT(INT,Substring(Codice,5,1)))= '15' THEN 'Lunedì - Venerdì'
WHEN SUM (CONVERT(INT,Substring(Codice,5,1)))= '21' THEN 'Lunedì - Sabato'
WHEN SUM (CONVERT(INT,Substring(Codice,5,1)))= '28' THEN 'Lunedì - Domenica'
WHEN SUM (CONVERT(INT,Substring(Codice,5,1)))<> '28' THEN 'NO'
WHEN SUM (CONVERT(INT,Substring(Codice,5,1)))<> '21' THEN 'NO'
WHEN SUM (CONVERT(INT,Substring(Codice,5,1)))<> '15' THEN 'NO'
WHEN SUM (CONVERT(INT,Substring(Codice,5,1)))<> '5' THEN 'NO'
WHEN SUM (CONVERT(INT,Substring(Codice,5,1)))<> '6' THEN 'NO'
WHEN SUM (CONVERT(INT,Substring(Codice,5,1)))<> '7' THEN 'NO'
END ,
SEDE,
INIZIO,
FINE
FROM dbo.CUST_TURNISTICA
GROUP BY LEFT(CODICE,4), RIGHT(CODICE,2), SEDE, INIZIO, FINE
Com'è possibile che la select mi restituisca dei record doppi?!?!? Non riesco a capirlo...
725x654
139Kb
441x276
42Kb
Bolo
Profilo
| Junior Member
58
messaggi | Data Invio:
ven 4 giu 2010 - 16:34
Trovato, scusatemi, c'è un campo FINE diverso, per sbaglio...
Torna su
Stanze Forum
Elenco Threads
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 !