Vista con raggruppamento di record

venerdì 04 giugno 2010 - 12.14

Bolo Profilo | Junior Member

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

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

Dovrebbe funzionare anche cosi
SELECT DISTINCT top 100% LEFT(CODICE,4) + RIGHT(CODICE,2) AS CODICE, INIZIO, FINE
FROM TABELLA

Bolo Profilo | Junior Member

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

>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

Grazie... mi hai instradato mentalmente verso la soluzione... se riesco più tardi posto il risultato!!!

Buon pomeriggio intanto

dinoxet Profilo | Senior Member

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

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

>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

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

Trovato, scusatemi, c'è un campo FINE diverso, per sbaglio...
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