0

Usando a condição IF em consulta SQL

criado por Webster Moitinho em 09/06/2010 12:38pm
Estou tentando me inicar nos cálculos do MySQL e não estou conseguindo sozinho.

TABELA CTPLANO
Campo Tipo Collation Atributos Nulo Padrão Extra Ação
id_plano int(11) Não None auto_increment
nroplano tinyint(4) Não None
contared decimal(6,0) Não None
conta decimal(6,0) Não None
contadep tinyint(4) Não None
contades tinyint(4) Não None
descrconta varchar(40) latin1_swedish_ci Não None
natureza enum('D','C') latin1_swedish_ci Não None
resultado enum('S','N') latin1_swedish_ci Não None
pedecgccpf enum('S','N') latin1_swedish_ci Não None
pedeccusto enum('S','N') latin1_swedish_ci Não None
ctafluxo enum('S','N') latin1_swedish_ci Não None
diario varchar(4) latin1_swedish_ci Não None


TABELA CTSALINI
Campo Tipo Collation Atributos Nulo Padrão Extra Ação
filial int(11) Não None
id_plano int(11) Não None
tppessoa smallint(6) Não None
cgccpf decimal(14,0) Não None
valor decimal(15,2) Não None
natureza enum('D','C') latin1_swedish_ci Não None


TABELA CTLANCTO
Campo Tipo Collation Atributos Nulo Padrão Extra Ação
id_lancto int(11) Não None auto_increment
filial smallint(2) Não None
nrolancto int(4) Não None
id_plano int(4) Não None
tppessoa smallint(2) Não None
cgccpf decimal(14,0) Não None
dtlancto date Sim NULL
id_planocp int(4) Não None
tppessoacp smallint(2) Não None
cgccpfcp decimal(14,0) Não None
tipolancto char(1) latin1_swedish_ci Não None
id_histor int(4) Não None
descrhistor char(40) latin1_swedish_ci Sim NULL
valor decimal(13,2) Não None
nrodocto int(4) Não None
seqdocto smallint(2) Não None
tpdocto char(3) latin1_swedish_ci Sim NULL
dtdocto date Não None
diario char(4) latin1_swedish_ci Não None
nrolote int(4) Não None


A primeira tabela contém o plano de contas. A segunda, os saldos iniciais e terceira os lançamentos. O que diferencia o valor positivo do negativo é a Natureza. Se Natureza == D então positivo, se == C então negativo. O meu código ficaria mais ou menos assim:

SELECT ctsalini.filial, ctplano.conta, ctplano.descrconta,
IIf(ctsalini.natureza == "D",ctsalini.valor,ctsalini.valor * -1) AS sldant,
IIf(ctlancto.tipolancto == "D",ctlancto.valor,0) AS deb
FROM ctlancto
INNER JOIN ctplano
INNER JOIN ctsalini ON ctplano.id_plano = ctsalini.id_plano AND ctlancto.id_plano = ctsalini.id_plano
WHERE ctsalini.filial Like 8
ORDER BY ctsalini.filial, ctplano.conta;

Só que tá dando erro de sintaxe... aonde eu errei?

Lista de Respostas:

+1
09/06/2010 3:16pm
(~14 anos atrás)
Marcos Regis respondeu:
não seria

IF(ctsalini.natureza == "D",ctsalini.valor,ctsalini.valor * -1) AS sldant,

pois o seu IF está com 2 I


+1
10/06/2010 3:53pm
(~14 anos atrás)
Marcos Regis respondeu:
o correto é

IF(valor_ou_campo=valor, VALOR RETORNADO SE FOR VERDADEIRO, VALOR RETORNADO SE FOR FALSO) as apelido

o correto é = e não ==

0
10/06/2010 2:00am
(~14 anos atrás)
Webster Moitinho respondeu:
Marcos, obrigado pela observação, mas ainda não estou conseguindo. O SQL tá criticando a sintaxe a partir do == "D"

0
11/06/2010 2:19pm
(~14 anos atrás)
Webster Moitinho respondeu:
Belezza marcos, agora deu certo... Muito obrigado pela ajuda!

Nova Resposta:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)