Aiuto su una stored procedure...sto bloccato :-(

lunedì 23 aprile 2007 - 12.13

trinity Profilo | Guru

Ho creato una tabella di questo genere:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra


all'interno della tabella posso avere i seguenti record:

codalbergo |CodComAlb|stato residenza |codstato|Comune residenza |Codcomune |nclienti |stato|
000000001|000000032 |ITALIA |ITA |TERRACINA |0000000032| 11 |A |
000000001|000000032 |ITALIA |ITA |TERRACINA |0000000032| 03 |P |
000000001|000000032 |GERMANIA | | | | 10 |A |

e così via

A= Arrivato P=Partito

allora a me serve avere come risultato questo:
far visualizzare i record che hanno presenti in albergo ossia italia ed il comune di Terracina ha 11 arrivati e 3 partiti pertanto ha 8 presenti in albergo mentre la germania ha 10 presenti in albergo quindi il risultato che vorrei avere è il seguente:


Stato residenza|comune residenza |nclienti|
ITALIA TERRACINA 08
GERMANIA 10

come posso strutturare la stored?

ciao


Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

Mato Profilo | Newbie

l'ho pensata in 3 secondi , ma non l'ho provata comunque la select nella stored deve essere piu o meno...

select
[Stato Residenza],
[Comune residenza],
sum(
case [stato]
When 'A' then Convert(int , [nclienti])
Else -Convert(int , [nclienti])
end )
From
Archivio_mov
group by
[Stato Residenza],
[Comune residenza]

oppure :
select
tmptbl.[Stato Residenza],
tmptbl.[Comune residenza],
sum(tmptbl.numero)
from
(
select
[Stato Residenza],
[Comune residenza],
case [stato]
When 'A' then Convert(int , [nclienti])
Else -Convert(int , [nclienti])
end as numero
From
Archivio_mov
) as tmptbl
group by
[Stato Residenza],
[Comune residenza]

Ciao!
ciò che penso così è

trinity Profilo | Guru

funzionano entrambi gli esempi.
grazie mille per l'aiuto.

una domanda ma tutte queste cose tipo il case la when il convert dove l'hai imparato per utilizzarlo nelle stored? Cioè come faccio a sapere o imparare per poter applicare il tutto nelle stored?

ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

Mato Profilo | Newbie

F1 su Query Analyzer di sql server 2003
( Books online !)
ciò che penso così è

trinity Profilo | Guru

>F1 su Query Analyzer di sql server 2003

io in sql server 2005 non ho query analyzer ho sql server 2005 management

>( Books online !)

dove posso trovare tutto ciò che riguarda i books online dove ci sono esempi e spiegazioni sulle stored ecc...
>ciò che penso così è

Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

Mato Profilo | Newbie

i Books online di SQL SERVER è l'help dell'ambienti enterprise manager di MSSQL!

ora io non so come è strutturato l'ambiente di sviluppo di sql 2005 ma la Microsoft li mette a disposizione sia sui suoi cd che online sul suo sito ( che oltretutto penso sia in italiano!!! ).

poi in libreria (sul "mulo") puoi trovare un mare di .pdf per esempio :

MSSQL - SQL Server 2000 Stored Procedure and XML Programming (Di Dejan Šunderic)

che secondo me da molto di piu di quello che uno puo chiedere ( richiesta una minima preparazione )

ciò che penso così è

trinity Profilo | Guru

>i Books online di SQL SERVER è l'help dell'ambienti enterprise
>manager di MSSQL!
>
>ora io non so come è strutturato l'ambiente di sviluppo di sql
>2005 ma la Microsoft li mette a disposizione sia sui suoi cd
>che online sul suo sito ( che oltretutto penso sia in italiano!!!
>).
>
>poi in libreria (sul "mulo") puoi trovare un mare di .pdf per
>esempio :
>
>MSSQL - SQL Server 2000 Stored Procedure and XML Programming
>(Di Dejan Šunderic)

ma questo Dejan Šunderic con tutte le spiegazioni li trovo sul mulo?
>
>che secondo me da molto di piu di quello che uno puo chiedere
>( richiesta una minima preparazione )
>
>ciò che penso così è

Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

Mato Profilo | Newbie

io l'ho trovato li !
e , non sembra, ma cercando Lì si trovano infinite risorse riguardo documenti, esempi, bozze, ecc ecc.
ciò che penso così è
Msn Contact : n.g.red@hotmail.it

trinity Profilo | Guru

ciao senti visto che ho fatto una ricerca sul mulo ma niente, mica potresti mandarmi il file pdf dei sql server che utilizzi via email? oppure posso darti il mio contatto msn

email: fabio@wondernet.biz
msn: captain_rubber@hotmail.com

ah dimenticavo nell'esempio che mi hai passato qualche post fa, io alla tua stored ho modificato qualcosina che serve a me tipo mettere un nome ad una colonna ecc.. e funziona perfettamente, solo che nella select io dovrei dire che se i record hanno ncomp =0 non me li deve far visualizzare..come posso fare?

ecco il codice

ALTER PROCEDURE [dbo].[GetPresentidett] ( @Codalbergo Int, @CodComAlb Int ) AS BEGIN select tmptbl.[Stato_Res], tmptbl.[Comune], tmptbl.[Prov], [npres]=sum(tmptbl.numero) from ( select [Stato_Res], [Comune], [prov], case [stato] When 'A' then Convert(int , [ncomp]) Else -Convert(int , [ncomp]) end as numero From Archivio_mov where codalbergo=@codalbergo And codcomalb=@codcomalb ) as tmptbl group by [Stato_Res], [Comune], [prov] Order By Stato_res END

grazie
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

Mato Profilo | Newbie

usa

WHERE . . . AND ncomp <> 0 !!

oppure

fuori dalla seconda select:

WHERE numero <> 0

cerco di mandartelo il piu presto possibile!



ciò che penso così è
Msn Contact : n.g.red@hotmail.it

trinity Profilo | Guru

>usa
>
>WHERE . . . AND ncomp <> 0 !!
>
>oppure
>
>fuori dalla seconda select:
>
>WHERE numero <> 0


allora ho scelto di utilizzare: where numero<>0 perchè devo prendere solo i record che hanno numero superiore a 0 e pertanto ho fatto così:

ALTER PROCEDURE [dbo].[GetPresentidett] ( @Codalbergo Int, @CodComAlb Int ) AS BEGIN select tmptbl.[Stato_Res], tmptbl.[Comune], tmptbl.[Prov], [npres]=sum(tmptbl.numero) from ( select [Stato_Res], [Comune], [prov], case [stato] When 'A' then Convert(int , [ncomp]) Else -Convert(int , [ncomp]) End As numero From Archivio_mov where codalbergo=@codalbergo And codcomalb=@codcomalb ) as tmptbl WHERE numero <> 0 group by [Stato_Res], [Comune], [prov] Order By Stato_res END

solo che non mi funziona se vedi l'immagine di seguito allegata noterai che FILIPPINE hanno il valore dato dalla variabile numero =0 ma vengono visualizzate


326x115 11Kb



>
>cerco di mandartelo il piu presto possibile!
>
>
>
>ciò che penso così è
>Msn Contact : n.g.red@hotmail.it

Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

Mato Profilo | Newbie

ho capito. . .

WHERE npres<>0

come clausola nella seconda select !!!

se devi fare invece un filtro su campi interessati dal group by allora
ti conviene usare la clausola

HAVING . . .

tra il group by e l'order by!!


ciò che penso così è
Msn Contact : n.g.red@hotmail.it

trinity Profilo | Guru

ci avevo pensato e ho fatto così:

ALTER PROCEDURE [dbo].[GetPresentidett] ( @Codalbergo Int, @CodComAlb Int ) AS BEGIN select tmptbl.[Stato_Res], tmptbl.[Comune], tmptbl.[Prov], [npres]=sum(tmptbl.numero) from ( select [Stato_Res], [Comune], [prov], case [stato] When 'A' then Convert(int , [ncomp]) Else -Convert(int , [ncomp]) End As numero From Archivio_mov where codalbergo=@codalbergo And codcomalb=@codcomalb ) as tmptbl where npres <>0 group by [Stato_Res], [Comune], [prov] Order By Stato_res END

lma mi dice: "Il nome di colonna 'npres' non è valido."

a meno che non sbaglio posizione oppure devo dichiarare qualcos'altro
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

Mato Profilo | Newbie

ALTER PROCEDURE [dbo].[GetPresentidett]
(
@Codalbergo Int,
@CodComAlb Int
)
AS
BEGIN
select
tmptbl.[Stato_Res],
tmptbl.[Comune],
tmptbl.[Prov],
sum(tmptbl.numero) AS npres
from
(
select
[Stato_Res],
[Comune],
[prov],
case [stato]
When 'A' then Convert(int , [ncomp])
Else -Convert(int , [ncomp])
End As numero
From
Archivio_mov where codalbergo=@codalbergo And codcomalb=@codcomalb
) as tmptbl
where sum(tmptbl.numero) <>0
group by
[Stato_Res],
[Comune],
[prov]
Order By Stato_res
END
ciò che penso così è
Msn Contact : n.g.red@hotmail.it

trinity Profilo | Guru

>ALTER PROCEDURE [dbo].[GetPresentidett]
>(
>@Codalbergo Int,
>@CodComAlb Int
>)
>AS
>BEGIN
>select
>tmptbl.[Stato_Res],
>tmptbl.[Comune],
>tmptbl.[Prov],
>sum(tmptbl.numero) AS npres
>from
>(
>select
>[Stato_Res],
>[Comune],
>[prov],
>case [stato]
>When 'A' then Convert(int , [ncomp])
>Else -Convert(int , [ncomp])
>End As numero
>From
>Archivio_mov where codalbergo=@codalbergo And codcomalb=@codcomalb
>) as tmptbl
>where sum(tmptbl.numero) <>0

ho fatto come hai detto tu qui ma mi esce questo messaggio di errore:
"È possibile specificare un'aggregazione in una clausola WHERE solo se è inclusa in una subquery di una clausola HAVING o in un elenco di selezione e la colonna da aggregare è un riferimento esterno."
>group by
>[Stato_Res],
>[Comune],
>[prov]
>Order By Stato_res
>END
>ciò che penso così è
>Msn Contact : n.g.red@hotmail.it

Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

Mato Profilo | Newbie

ALTER PROCEDURE [dbo].[GetPresentidett]
(
@Codalbergo Int,
@CodComAlb Int
)
AS
BEGIN
select
tmptbl.[Stato_Res],
tmptbl.[Comune],
tmptbl.[Prov],
sum(tmptbl.numero) AS npres
from
(
select
[Stato_Res],
[Comune],
[prov],
case [stato]
When 'A' then Convert(int , [ncomp])
Else -Convert(int , [ncomp])
End As numero
From
Archivio_mov where codalbergo=@codalbergo And codcomalb=@codcomalb
) as tmptbl
group by
[Stato_Res],
[Comune],
[prov]
HAVING npres <> 0
Order By Stato_res
END

oppure

ALTER PROCEDURE [dbo].[GetPresentidett]
(
@Codalbergo Int,
@CodComAlb Int
)
AS
BEGIN
select
tmptbl.[Stato_Res],
tmptbl.[Comune],
tmptbl.[Prov],
sum(tmptbl.numero) AS npres
from
(
select
[Stato_Res],
[Comune],
[prov],
case [stato]
When 'A' then Convert(int , [ncomp])
Else -Convert(int , [ncomp])
End As numero
From
Archivio_mov where codalbergo=@codalbergo And codcomalb=@codcomalb
) as tmptbl
group by
[Stato_Res],
[Comune],
[prov]
HAVING sum(tmptbl.numero) <> 0
Order By Stato_res
END

i filtri sulle aggregazioni si fanno nella clausola HAVING!!!

ciò che penso così è
Msn Contact : n.g.red@hotmail.it

trinity Profilo | Guru

ciao scusami se ti disturbo di nuovo,
ma ricordi la stored dei post precedenti che mi hai consigliato, funziona perfettamente, solo che ho dovuto fare un'integrazione ed ecco quella nuova:

ALTER PROCEDURE [dbo].[GetPresentidett] ( @Codalbergo Int, @CodComAlb Int ) AS BEGIN select tmptbl.[data_elaborazione], tmptbl.[Stato_Res], tmptbl.[Comune], tmptbl.[Prov], --[npres]=sum(tmptbl.numero) sum(tmptbl.numero) AS npres from ( select [data_elaborazione], [Stato_Res], [Comune], [prov], case [stato] When 'A' then Convert(int , [ncomp]) Else -Convert(int , [ncomp]) End As numero From Archivio_mov where codalbergo=@codalbergo And codcomalb=@codcomalb ) as tmptbl group by [data_elaborazione], [Stato_Res], [Comune], [prov] HAVING sum(tmptbl.numero) <> 0 Order By data_elaborazione END

come potrai osservare ho introdotto il campo data_elaborazione solo che mi succede questo ossia vedi figura allegata:

409x96 14Kb


come potrai vedere visto che le date sono diverse non mi effettua la sottrazione.
In altre porole io devo fare sempre la sottrazione ma debbo far visualizzare la data_elaborazione del record con stato=A perchè quelle con stato=P sono solo dati che vengono sottratti.

puoi darmi una mano?

probabilmente perchè non riesce a fare il group by visto che le date sono diverse...

ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

Mato Profilo | Newbie

prova così . . .

ALTER PROCEDURE [dbo].[GetPresentidett]
(
@Codalbergo Int,
@CodComAlb Int
)
AS
BEGIN
select
tmptbl.[data_elaborazione],
tmptbl.[Stato_Res],
tmptbl.[Comune],
tmptbl.[Prov],
sum(tmptbl.numero) AS npres
from(
select
A.[data_elaborazione],
Archivio_mov.[Stato_Res],
Archivio_mov.[Comune],
Archivio_mov.[prov],
case Archivio_mov.[stato] When 'A' then Convert(int , Archivio_mov.[ncomp])
Else -Convert(int , Archivio_mov.[ncomp])
End As numero
From
Archivio_mov INNER JOIN
(
select
MAX([data_elaborazione]) AS [data_elaborazione],
[Stato_Res],
[Comune],
[prov]
from
Archivio_mov
where
[stato] = 'A'
group by
[Stato_Res],
[Comune],
[prov]
) AS A
ON A.[Stato_Res] = Archivio_mov.[Stato_Res] AND A.[Comune] = Archivio_mov.[Comune] AND A.[prov] = Archivio_mov.[prov]
where
codalbergo = @codalbergo And
codcomalb = @codcomalb
) as tmptbl
group by
[data_elaborazione],
[Stato_Res],
[Comune],
[prov]
HAVING
sum(tmptbl.numero) <> 0
Order By
data_elaborazione
END

se funziona dovrebbe darti come data visualizzata quella dell'ultimo incremento !!!!
ciò che penso così è
Msn Contact : n.g.red@hotmail.it

trinity Profilo | Guru

no insostanza funziona così ti faccio un esempio di record

immaginiamo questo:

A=arrivato
P=partito

pertanto avrò nel db una cosa simile:

stato comune ncomp stato data_elaborazione
italia roma 10 A 03/05/2007
Francia 3 A 03/05/2007
italia roma 3 P 04/05/2007

quindi io come risultati devo avere i seguenti record:

stato comune ncomp stato data_elaborazione
italia roma 7 A 03/05/2007
Francia 3 A 03/05/2007

cioè devo sempre far vedere la data dello stato arrivato però se c'è un partito fare la sottrazione del numero componenti

comunque la tua stored l'ho testa non da problemi ma prendere effettua la sottrazione e mi fa vedere la massima data ma gli altri record non me li fa vedere ossia record per esempio quello della Francia

ciao e grazie
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com
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