[SQL2005]Aiuto per query

martedì 06 gennaio 2009 - 14.10

Teech Profilo | Expert

Ho 2 tabelle così composte:
Tabella Operatori
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
Tabella Attività
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
Stò disperatamente cercando di creare una SP che mi restituisca tutti gli Operatori e per ogni operatore un valore che mi indica se esiste almeno un'attività in corso per quell'operatore. Un risultato tipo:
Alfa - True (è presente un'attività iniziata ma non finita)
Beta - False (Solo attività finite)
Gamma - False (nessuna attività presente)

Come flag per capire se una attività e finita o in corso uso il campo Tempo della tabella attività, ma non riesco proprio a raggiungere il risultato.
Per il momento sono arrivato a questo punto:
SELECT op.CODICE, op.NOME, CASE Tempo WHEN 0 THEN 1 ELSE 0 END AS InCorso FROM dbo.Operatori AS op LEFT OUTER JOIN dbo.Attivita AS at ON op.CODICE = at.OPERATORE
In questo caso mi vengono restituite, per ogni operatore il numero delle righe di attività presenti... Non riesco a capire come fare...

Avete consigli?
Grazie mille
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

lbenaglia Profilo | Guru

>Avete consigli?

Ciao Maurizio,

direi che ci sei quasi, basta solo effettuare un raggruppamento per Codice e Nome prendendo il massimo valore di InCorso:

USE tempdb; CREATE TABLE dbo.Operatori( CODICE varchar(9) NOT NULL, NOME varchar(10) NOT NULL, CONSTRAINT PK_Operatori PRIMARY KEY(CODICE) ); CREATE TABLE dbo.Attivita( IDATTIVITA int IDENTITY(1,1) NOT NULL, OPERATORE varchar(9) NOT NULL, INIZIO datetime NOT NULL, FINE datetime NULL, TEMPO AS (isnull(round(datediff(second,Inizio,Fine),(0)),(0))) PERSISTED NOT NULL, CONSTRAINT PK_Attivita PRIMARY KEY(IDATTIVITA), CONSTRAINT FK_Attivita_Operatori FOREIGN KEY(Operatore) REFERENCES dbo.Operatori(Codice) ); INSERT dbo.Operatori VALUES ('002.00001', 'Alfa'); INSERT dbo.Operatori VALUES ('002.00002', 'Beta'); INSERT dbo.Operatori VALUES ('002.00003', 'Gamma'); INSERT dbo.Attivita VALUES ('002.00001', '20090105 08:00:00', '20090105 10:00:00'); INSERT dbo.Attivita VALUES ('002.00001', '20090106 08:00:00', NULL); INSERT dbo.Attivita VALUES ('002.00002', '20090105 09:00:00', '20090105 10:30:00'); WITH CTE_Attività(Codice, Nome, InCorso) AS ( SELECT op.CODICE , op.NOME , CASE Tempo WHEN 0 THEN 1 ELSE 0 END FROM dbo.Operatori AS op LEFT JOIN dbo.Attivita AS at ON op.CODICE = at.OPERATORE ) SELECT Codice , Nome , MAX(InCorso) AS InCorso FROM CTE_Attività GROUP BY Codice , Nome; /* Output: Codice Nome InCorso --------- ---------- ----------- 002.00001 Alfa 1 002.00002 Beta 0 002.00003 Gamma 0 (3 row(s) affected) */ DROP TABLE dbo.Attivita, dbo.Operatori;

>Grazie mille
Prego.

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

Teech Profilo | Expert

Era più semplice del previsto... Mi sono incartato perchè non ho pensato alla funzione MAX (non l'ho associata ad un valore di tipo bit) e ho provato a fare query e sottoquery con raggrupamenti e selezioni varie perdendo la retta via

Grazie mille!!! Mi hai risolto un problema che mi bloccava
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole
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