Query Sql con all'interno un'operazione matematica

mercoledì 13 dicembre 2006 - 10.45

trinity Profilo | Guru

Ciao Ragazzi,
ho scritto la seguente riga di codice in sql:

SELECT SUM(ncomp)
AS Ncomp
FROM dbo.Archivio_mov
WHERE
codalbergo IN (@Codalbergo)
GROUP BY
stato

il risultato è corretto mi riporta 2 righe con due valori corretti per il mio scopo.

Solo che vorrei far fare direttamente la procedura di sottrazione del valore della prima riga con quello della seconda che la query mi riporta direttamente nella query stessa(scusate il gioco di parole) in modo tale da ottente direttamente il valore finale, esempio:

la query mi restituisce i seguenti valori;

25
13

io successivamente dovrei fare una sottrazione tra 25-13 per ottenere come risultato 12..posso farlo direttamente nella query postata sopra?

Ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/

ysdemarc Profilo | Expert

Da quel poco sql che so non penso che così tu possa farlo poichè crei in questo modo una tabella di dati che poi leggi tramite cursore

se vuo ifarlo con una query secca visto che hai solo 2 tipi di satto potresti fare così:

SELECT SUM(A1.ncomp) - SUM(A2.ncomp) AS Ncomp
FROM dbo.Archivio_mov A1
INNER JOIN dbo.Archivio_mov A2
ON A2.codalbergo = A2.codalbergo
WHERE A1.codalbergo IN (@Codalbergo)
AND A1.stato = @stato_di_a1
AND A2.stato = @stato_di_a2


altrimenti l'unica soluzione che mi viene in mente è un'elaborazione da codice o da sql con fetch cursori e quant'altro che però sarei curioso di provare

Ciao
Vincenzo
Programmatore sbilenco

trinity Profilo | Guru

Ma io i dati li ho in una sola tabella non in due quindi il join non serve.
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/

gigi_sullivan Profilo | Newbie

Ciao
usi sqlserver? access? db2?

>SELECT SUM(ncomp)
>AS Ncomp
>FROM dbo.Archivio_mov
>WHERE
>codalbergo IN (@Codalbergo) -------perche' non fai direttamente codalbergo = @Codalbergo
>GROUP BY
>stato

>il risultato è corretto mi riporta 2 righe con due valori corretti
>per il mio scopo.

Se ho capito bene.. hai solo due stati per quel codice.
Se e' cosi' sempre (e ripeto:sempre 2) puoi fare:

declare @a int, @b int

SELECT @a = SUM(ncomp)
FROM @tab
WHERE
codalbergo = @Codalbergo
and stato = 'A' -- invece della group fai stato = 'primo stato'

SELECT @b = SUM(ncomp)
FROM @tab
WHERE
codalbergo = @Codalbergo
and stato = 'b'


select @a
union
select @b
union
select @a - @b


Se gli stati sono di piu' devi dire almeno tra chi vuoi la differenza.. chi e' il primo, e chi deve sottrarre (di cui puoi fare la somma) per cui la seconda parte della qry diventerebbe:

SELECT @b = SUM(ncomp)
FROM @tab
WHERE
codalbergo = @Codalbergo
and stato <> 'a'

e tutto il resto come prima

Ciao

trinity Profilo | Guru

Utilizzo sql server express 2005.
Sono sempre due ma utilizzo il group by per questo motivo ti faccio vedere un esempio dei record salvati in archivio

codalb stato ncomp situazione
1 ITALIA 10 ARRIVATI
1 ITALIA 7 PARTITI
1 GERMANIA 12 ARRIVATI
1 GERMANIA 8 PARTITI

allora io debbo ottenere nella query la somma di tutti gli arrivati, la somma di tutti i partiti e poi devo effettuare la differenza tra il totale arrivati meno il totale partiti ed ottenere il risultato

Ecco tutto questo vorrei farlo mediante una query sql.


Ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/

gigi_sullivan Profilo | Newbie

..allora fai le sostituzioni del caso nella query di sopra e vedrai che andra' tutto bene.

Se mi dici i dati precisi te la scrivo io.

declare @a int, @b int

SELECT @a = SUM(ncomp)
FROM dbo.Archivio_mov
WHERE
codalbergo = @Codalbergo
and stato = 'il tuo primo stato'

SELECT @b = SUM(ncomp)
FROM dbo.Archivio_mov
WHERE
codalbergo = @Codalbergo
and stato = 'il tuo secondo stato'


select @a, 'il tuo primo stato'
union
select @b, 'il tuo secondo stato'
union
select @a - @b, 'differenza'

trinity Profilo | Guru

Utilizzo sql server express 2005.
Sono sempre due ma utilizzo il group by per questo motivo ti faccio vedere un esempio dei record salvati in archivio

codalb stato ncomp situazione
1 ITALIA 10 ARRIVATI
1 ITALIA 7 PARTITI
1 GERMANIA 12 ARRIVATI
1 GERMANIA 8 PARTITI

allora io debbo ottenere nella query la somma di tutti gli arrivati, la somma di tutti i partiti e poi devo effettuare la differenza tra il totale arrivati meno il totale partiti ed ottenere il risultato.


tieni presente che la tabella si chiama Movimenti e che il nome delle colonne è lo stesso che ho indicato in alto sull'esempio

Ecco tutto questo vorrei farlo mediante una query sql.
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/

gigi_sullivan Profilo | Newbie

declare @tbl table
(Ncomp int, ordColumn int)

declare @arrivati int, @partiti int

SELECT @arrivati = SUM(ncomp)
FROM dbo.Movimenti
WHERE
codalb = @Codalbergo
and situazione = 'ARRIVATI'


SELECT @partiti = SUM(ncomp)
FROM dbo.Movimenti
WHERE
codalb = @Codalbergo
and situazione = 'PARTITI'

insert into @tbl
select @arrivati, 1
union
select @partiti, 2
union
select @arrivati - @partiti, 3


select Ncomp from @tbl
order by ordColumn

ysdemarc Profilo | Expert

> Ma io i dati li ho in una sola tabella non in due quindi il join non serve.

E che significa?

Nessuno vieta di mettere in join una tabella con se stessa.

I tuoi tipi sono due quindi se rimangono tali allora mi sembra la soluzione più valida e breve.

Poi vedi un pò tu.

Ciao
Vincenzo
Programmatore sbilenco

trinity Profilo | Guru

Allora ecco in sintesi la struttura della mia tabella con i dati dentro

codalb stato ncomp situazione
1 ITALIA 10 ARRIVATI
1 ITALIA 7 PARTITI
1 GERMANIA 12 ARRIVATI
1 GERMANIA 8 PARTITI

allora io debbo ottenere nella query la somma di tutti gli arrivati, la somma di tutti i partiti e poi devo effettuare la differenza tra il totale arrivati meno il totale partiti ed ottenere il risultato


il tuo primo esempio è stato il seguente:

SELECT SUM(A1.ncomp) - SUM(A2.ncomp) AS Ncomp
FROM dbo.Archivio_mov A1
INNER JOIN dbo.Archivio_mov A2
ON A2.codalbergo = A2.codalbergo
WHERE A1.codalbergo IN (@Codalbergo)
AND A1.stato = @stato_di_a1
AND A2.stato = @stato_di_a2

con il join come potrei ottente il mio risultato

Ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/

ysdemarc Profilo | Expert

codalb stato ncomp situazione
1 ITALIA 10 ARRIVATI
1 ITALIA 7 PARTITI
1 GERMANIA 12 ARRIVATI
1 GERMANIA 8 PARTITI

andrebbe modificata così:

SELECT SUM(A1.ncomp) - SUM(A2.ncomp) AS Ncomp
FROM dbo.Archivio_mov A1
INNER JOIN dbo.Archivio_mov A2
ON A2.codalbergo = A2.codalbergo
AND A2.Stato = A1.Stato
WHERE A1.codalbergo IN (@Codalbergo)
AND A1.Sistuazione = 'ARRIVATI'
AND A2.Situazione = 'PARTITI'
Vincenzo
Programmatore sbilenco
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