Case when ??

lunedì 14 aprile 2008 - 08.25

Pongo Profilo | Senior Member

Ciao a tutti!

Non riesco a fare una cosa con un unico passaggio di sql.

Ho questa query:
select MP.nodo, count(*) as 'Numero Pagamenti', sum (importopagamento-resto)as Incassato, MP.valuta
from movimentipagamenti as MP
inner join movimentitestate as MT on
(MP.nodo=MT.nodo and MP.anno=MT.anno and MP.numero=MT.numero and
MP.tipo=MT.tipo)
where MP.tipo='s1'
and MT.data>'20080401'
and MT.annullato='0'
group by MP.nodo, MP.valuta
order by Incassato desc;

e mi ritorna i dati dell'incassato dei negozi nella valuta della nazione.
Io vorrei, a seconda della valuta avere un risultato diverso di Incassato. Per esempio se la valuta è 'DKK' incassato=incassato/7.5.


Ho provato con il declare di una variabile, ma se inizializzo la variabile con una select, poi non posso fare null'altro in quella select.

Come potrei fare??
per farvi capire meglio:

001 1900 EUR
002 170000 DKK

Vorrei che diventasse
001 1900 EUR
002 (170000/7.5) EUR

Ciao!

amelix Profilo | Expert

Domanda: hai una tabella valuta o il case when del subject deve farlo al posto tuo?
Se è vera la prima ... perfetto!
Altrimenti malissimo!!!

A.
Andrea - http://www.MelisWeb.eu/
CMS - http://www.WebOrama.it/

Pongo Profilo | Senior Member

>Domanda: hai una tabella valuta o il case when del subject deve
>farlo al posto tuo?
>Se è vera la prima ... perfetto!
>Altrimenti malissimo!!!
>


Ciao! In che senso una tabella valuta?? Valuta è un campo che ho nella tabella movimentipagamenti, una delle due tabelle messe in join.

SQL può per ogni riga della select "capire" il contenuto di una cella e cambiare il contenuto di una cella successiva??

Il problema è questo.

BEGIN
/* Dichiaro la variabile */
DECLARE @Valuta AS varchar(3)
/* Inizializzo la variabile */
SET @Valuta = ''
/* Recupero il valore e lo assegno con una istruzione SELECT */
SELECT @Valuta=MP.valuta
from movimentipagamenti as MP
inner join movimentitestate as MT on
(MP.nodo=MT.nodo and MP.anno=MT.anno and MP.numero=MT.numero and
MP.tipo=MT.tipo)
where MP.tipo='s1'
and MT.data>'20080401'
and MT.annullato='0'
group by MP.nodo, MP.valuta
--order by Incassato desc;
print
@valuta
END


Usando questa beging end becco il valore della valuta, ma a chi lo do in pasto??

AndreaKpr Profilo | Senior Member

Ciao, prova cosi


>>SELECT MP.nodo, count(*) as 'Numero Pagamenti', MP.valuta,
>> CASE WHEN (MP.valuta = 'DKK') THEN ((sum (importopagamento-resto)) / 7.5) ELSE (sum (importopagamento-resto)) AS Incassato
>>FROM movimentipagamenti inner join movimentitestate on
>>(MP.nodo=MT.nodo and MP.anno=MT.anno and MP.numero=MT.numero and MP.tipo=MT.tipo)
>>WHERE MP.tipo='s1' and MT.data>'20080401' and MT.annullato='0'
>>GROUP BY MP.nodo, MP.valuta
>>ORDER BY Incassato desc;
>>CASE WHEN Disabilitato=1 THEN 'NO' ELSE 'SI' END AS Abil FROM Agenti WHERE (Tipo = 'Agente') ORDER BY CodiceAgente"

Non l'ho potuta provare, per ovvi motivi, ma per problemi simili ho fatto sempre cosi...
Ziao!

Pongo Profilo | Senior Member

PErfetto, grazie mille!!!

Mancava solo End alla fine del case!

select MP.nodo, count(*) as 'Numero Pagamenti', MP.valuta,
CASE MP.valuta
WHEN 'DKK'
THEN ((sum (importopagamento-resto)) / 7.5)
WHEN 'UFL'
THEN ((sum (importopagamento-resto)) / 250)
ELSE (sum (importopagamento-resto))
END
AS Incassato
from movimentipagamenti as MP
inner join movimentitestate as MT on
(MP.nodo=MT.nodo and MP.anno=MT.anno and MP.numero=MT.numero and
MP.tipo=MT.tipo)
where MP.tipo='s1'
and MT.data>'20080401'
and MT.annullato='0'
group by MP.nodo, MP.valuta
order by Incassato desc;

Ciao!!!

AndreaKpr Profilo | Senior Member


Bene, sono contento che funzioni...

Pardon per l'end finale
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