Query raggruppamento e confronto stati

lunedì 03 giugno 2013 - 13.57

Bolo Profilo | Junior Member

Ciao A tutti,

ho una richiesta un pò bizzarra per una query che non riesco nemmeno ad immaginarmi come fare.
Ho una serie di record di impianti su cui avvengono determinate lavorazioni periodiche; ogni impianto ha più record (uno per lavorazione) e ad esso è associato uno stato (grigio = emesso, rosso = inizio lavori, giallo = fine lavori, verde = convalidato).
Vorrei fare una query che mi estragga un elenco delle sedi con lo stato "minore" o quanto meno vincolante alla convalida dei lavori tra questi; mi spiego meglio, se la sede ha tutte le lavorazioni sullo stesso stato sarà quello che comanda, altrimenti anche se una sola sede ha uno stato "inferiore", comanda quello, per esempio se 3 lavorazioni sono su fine lavori e una su emesso, lo stato globale sarà emesso...

Spero di essermi spiegato...

Idee?

Grazie

renarig Profilo | Expert

>Spero di essermi spiegato...

Non ho capito molto,

Tu hai parlato di
- Impianti
- Sedi
- Lavoazone
- Stato
Non mi è chiara la differenza fra Impianti e Sedi
( forse sono la stessa cosa )
_________________________________

Dicci invece il
NomeTabella
NomeCampi
Un po di record inseriti
Il risultato che vuoi ottenere


.

Bolo Profilo | Junior Member

In effetti immagino sia di difficile comprensione... comunque si, sedi e impianti sono la stessa cosa. Faccio un esempio pratico:

TABELLA: lavori
CAMPI: impianto, lavorazione, stato

Esempi di record:

1: imp1, lav1, iniziolavori
2: imp1, lav2, iniziolavori
3: imp2, lav1, iniziolavori
4: imp2, lav2, convalidato
5: imp2, lav3, finelavori
6: imp3, lav1, finelavori
7: imp3, lav2, convalidato

La query dovrebbe restituire:

imp1, iniziolavori
imp2, iniziolavori
imp3, finelavori

Praticamente:

-> se almeno una lavorazione è su iniziolavori, lo stato dell'impianto sarà su iniziolavori
OPPURE
-> se almeno una è su finelavori e nessuna su iniziolavori lo stato sarà finelavori
OPPURE
-> se tutte sono su convalidato lo stato sarà convalidato

Insomma con un if sarebbe facile ma in SQL server non saprei come tradurlo...

Grazie

renarig Profilo | Expert

>Insomma con un if sarebbe facile ma in SQL server non saprei come tradurlo...
iif(stato = "emesso";1;0)
CASE WHEN stato = 'emesso' THEN 1 ELSE 0 END

_________________________________________________________________

ma il problema a parer mio e piu grosso,
tu stesso nei 2 post precedenti hai scritto alternativamente:
"iniziolavori" oppure "inizio lavori"
qualcun'altro magari scrivera "Inizio L." ????????

La soluzione sarebbe una tabellina di 4 record da mettere in JOIN con la tabella "lavori"
avresti cosi la possibilita di numerare in modo crescente i 4 stati per poi
------- raggruppare per lavori ed estrarre il Min di stato

________________________________________________________

se non puoi fare la tabellina in alternativa potresti rinominare i tuoi 4 stati

emesso ---------> assegnato
iniziolavori ------> iniziolavori
finelavori -------> terminelavori
convalidato -----> validato
in modo che gli stati siano in ordine alfabetico e ti prendi sempre il minimo

__________________________________________________________

in ultima alternativa facciamo 2 viste con tanti CASE WHEN ......
e risolviamo il problema



.

Bolo Profilo | Junior Member

Caspita quella del minimo è una genialata

DIrei che è la mia soluzione, ti ringrazio tantissimo... ora vedo come attuarla bene, in caso mi rifaò vivo!!!
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-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5