Usando a condição IF em consulta SQL
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?
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?
comentários (0)
suspender
Lista de Respostas:
09/06/2010 3:16pm
(~14 anos atrás)
(~14 anos atrás)
não seria
IF(ctsalini.natureza == "D",ctsalini.valor,ctsalini.valor * -1) AS sldant,
pois o seu IF está com 2 I
IF(ctsalini.natureza == "D",ctsalini.valor,ctsalini.valor * -1) AS sldant,
pois o seu IF está com 2 I
10/06/2010 3:53pm
(~14 anos atrás)
(~14 anos atrás)
o correto é
IF(valor_ou_campo=valor, VALOR RETORNADO SE FOR VERDADEIRO, VALOR RETORNADO SE FOR FALSO) as apelido
o correto é = e não ==
IF(valor_ou_campo=valor, VALOR RETORNADO SE FOR VERDADEIRO, VALOR RETORNADO SE FOR FALSO) as apelido
o correto é = e não ==
10/06/2010 2:00am
(~14 anos atrás)
(~14 anos atrás)
Marcos, obrigado pela observação, mas ainda não estou conseguindo. O SQL tá criticando a sintaxe a partir do == "D"
11/06/2010 2:19pm
(~14 anos atrás)
(~14 anos atrás)
Belezza marcos, agora deu certo... Muito obrigado pela ajuda!