Jmsilva Posted September 20, 2016 Report Share Posted September 20, 2016 Tenho um banco com as tabelas "clientes" e "NF", preciso de vetor(resultado) que tenha o código do cliente, nome, última data que foi emitido nf, cálculo dos dias em relação a última nota fiscal. Alguém tem alguma sugestão de um único comando sql para resolver isso. Clientes->cod e nome NF->cod,nfe e dtanfe JMSIVA Quote Link to comment Share on other sites More sharing options...
Edu Posted September 20, 2016 Report Share Posted September 20, 2016 Boa tarde amigo. Tenta assim: SELECT DISTINCT Clientes.cod, Clientes.nome, NF.nfe, max(NF.dtanfe) from Clientes INNER JOIN NF ON Clientes.cod = NF.codigoDoCliente ORDER BY Clientes.cod; Na cláusula ON : Substituir pelos campos de relacionamento das suas tabelas. Na cláusula ORDER BY: Substituir pelo campo que queira ordenar. Abraço. Quote Link to comment Share on other sites More sharing options...
Jmsilva Posted February 16, 2017 Author Report Share Posted February 16, 2017 Olá, o comando sql funcionou, mas preciso fazer uma lista com todos os clientes com ou sem nfe, para aqueles que tem NF trazer a última data max(NF.dtanfe) . No exemplo trouxe apenas os cliente com nfe. Aproveitando, dentro da nfe tem campo tipo que pode ser 1 ou 2, preciso saber da ultima data para cada tipo, é possível fazer em um unico cmd sql. SELECT DISTINCT Clientes.cod, Clientes.nome, NF.nfe, max(NF.dtanfe) from Clientes INNER JOIN NF ON Clientes.cod = NF.codigoDoCliente ORDER BY Clientes.cod; com left join trás todos os clientes, mas com função max() , não funcionou SELECT DISTINCT Clientes.cod, Clientes.nome, NF.nfe, max(NF.dtanfe) from Clientes LEFT JOIN NF ON Clientes.cod = NF.codigoDoCliente ORDER BY Clientes.cod; Quote Link to comment Share on other sites More sharing options...
Edu Posted February 16, 2017 Report Share Posted February 16, 2017 O LEFT JOIN é o comando certo pra vc fazer isso. Estranho o max() não ter funcionado. Qual banco de dados vc está usando? Quote Link to comment Share on other sites More sharing options...
Jmsilva Posted February 16, 2017 Author Report Share Posted February 16, 2017 O LEFT JOIN é o comando certo pra vc fazer isso. Estranho o max() não ter funcionado. Qual banco de dados vc está usando? Uso a biblioteca Sqlite, Quote Link to comment Share on other sites More sharing options...
Edu Posted February 16, 2017 Report Share Posted February 16, 2017 Uso a biblioteca Sqlite, Tenta tirar a cláusula ORDER BY. Quote Link to comment Share on other sites More sharing options...
Jmsilva Posted February 16, 2017 Author Report Share Posted February 16, 2017 Edu, Assim funcionou, tá meio estranho! mas é só para teste, considere-se a ideia de duas tabelas uma de clientes outra de nota fiscal. SELECT DISTINCT Clientes.prec_cp, Clientes.nick, NF.dtaserv from cadetes as Clientes LEFT JOIN escala_normal as nf ON Clientes.prec_cp = nf.prec_cp1 group by clientes.prec_cp; O problema que a tabela NF possui um campo TIPO (1 OU 2), DTASERV e ID do cliente (prec_cp1), preciso que o comando SQL retorne duas datas a última data para o tipo=1 e a outra para o tipo=2, se não exstir não tem problema, tem que retornar a data em branco, pq preciso de todos os clientes com ou sem data. estou pesquisando e fazendo testes.....se tiver alguma sugestão agradeço. SELECT DISTINCT Clientes.prec_cp, Clientes.nick, NF.dtaserv as dtaTipo1, NF.dtaserv as dtaTipo2 from ..... Pesquisando algo assim... Quote Link to comment Share on other sites More sharing options...
Jmsilva Posted February 16, 2017 Author Report Share Posted February 16, 2017 Edu, os comandos abaixo fazem o que preciso, porém vou ter executar separadamente e juntar depois, tem como um único comando sql: 1) SELECT Clientes.prec_cp, Clientes.nick, Max(NF.dtaserv) as dta1, nf.tipo from cadetes as Clientes LEFT JOIN escala_normal as nf ON Clientes.prec_cp = nf.prec_cp1 and nf.tipo='1' GROUP BY clientes.prec_cp; 2)SELECT Clientes.prec_cp, Clientes.nick, Max(NF.dtaserv) as dta1, nf.tipo from cadetes as Clientes LEFT JOIN escala_normal as nf ON Clientes.prec_cp = nf.prec_cp1 and nf.tipo='2' GROUP BY clientes.prec_cp Quote Link to comment Share on other sites More sharing options...
joaosolution Posted February 16, 2017 Report Share Posted February 16, 2017 JMSILVA (comando1) UNION (comando2) ou (comando1) UNION ALL (comando2) Att João Bosco Quote Link to comment Share on other sites More sharing options...
Jmsilva Posted February 16, 2017 Author Report Share Posted February 16, 2017 João, valeu funciona mas não resolve, preciso de um resultado assim: Clientes.prec_cp, Clientes.nick, Max(NF.dtaserv) as data1, Max(NF.dtaserv) as data2 ... sendo que data1 com tipo='1' e data2 com tipo='2', durante o processamento necessita das duas datas para realizar dois cálculos com date() caso ela exista. por ora, vou fazer as duas chamadas e faço junção dos vetores. Quote Link to comment Share on other sites More sharing options...
miragerr Posted February 16, 2017 Report Share Posted February 16, 2017 Ola, Boa noite Tenta da seguinte forma and nf.tipo IN( '1' ,'2' ) Espero que ajude Quote Link to comment Share on other sites More sharing options...
joaosolution Posted February 17, 2017 Report Share Posted February 17, 2017 JMSilva Coloque a coluna da data 2 como um novo select: SELECT Clientes.prec_cp, Clientes.nick, Max(NF.dtaserv) as dta1, nf.tipo, (SELECT Clientes.prec_cp, Clientes.nick, Max(NF.dtaserv) as dta1, nf.tipo from cadetes as Clientes LEFT JOIN escala_normal as nf ON Clientes.prec_cp = nf.prec_cp1 and nf.tipo='2' GROUP BY clientes.prec_cp) as data2 from cadetes as Clientes LEFT JOIN escala_normal as nf ON Clientes.prec_cp = nf.prec_cp1 and nf.tipo='1' GROUP BY clientes.prec_cp; Att João Bosco Quote Link to comment Share on other sites More sharing options...
Jmsilva Posted February 17, 2017 Author Report Share Posted February 17, 2017 JOÃO, obrigado, mas não funcionou, mas vou trabalhar no seu post, ele não reconheceu o segundo select, eu me lembro da faculdade de fazer a chamada select dentro de outro. O comando abaixo quase funcionou, o problema que tabela cadetes tem idturma, que diferencia o grupo de pessoas, no caso exemplo abaixo ele faz o que preciso, mas traz todos os registro sem levar em conta o filtro dos cadetes (clientes). SELECT c.prec_cp, c.numero, c.nick, c.uf, max(e.dtaserv),count(id) FROM cadetes AS c LEFT JOIN escala_normal AS e ON c.idturma=2017 and c.prec_cp=e.prec_cp1 and e.tipo='1' GROUP BY c.prec_cp; PQ NÃO FAZ FILTRO SO DOS CLIENTES COM IDTURMA=2017 ? Resolvido: SELECT c.prec_cp, c.numero, c.nick, c.idturma, e.tipo,max(e.dtaserv), count(e.id) FROM cadetes AS c LEFT JOIN escala_normal AS e ON c.prec_cp=e.prec_cp1 and e.tipo='1' where idturma = 2017 group by c.prec_cp; quanto ao segunda data foço inner join e junto for next obrigado! Quote Link to comment Share on other sites More sharing options...
evandro Posted February 17, 2017 Report Share Posted February 17, 2017 Olá, Crie uma tabela temporária com uma informação e faça join com a outra: create TEMPORARY table temp01 SELECT Clientes.prec_cp, Clientes.nick, Max(NF.dtaserv) as dta1, nf.tipo from cadetes as Clientes LEFT JOIN escala_normal as nf ON Clientes.prec_cp = nf.prec_cp1 and nf.tipo='1' GROUP BY clientes.prec_cp; create TEMPORARY table temp02 SELECT Clientes.prec_cp, Clientes.nick, Max(NF.dtaserv) as dta1, nf.tipo from cadetes as Clientes LEFT JOIN escala_normal as nf ON Clientes.prec_cp = nf.prec_cp1 and nf.tipo='2' GROUP BY clientes.prec_cp; create index temp01 ON temp01 (nick); create index temp02 ON temp02 (nick); SELECT t1.prec_cp, t1.nick, t1.dta1, t2.dta2, t1.tipo from temp01 as t1 left join temp02 as t2 on t1.nick=t2.nick; Quote Link to comment Share on other sites More sharing options...
jfaguiar Posted February 19, 2017 Report Share Posted February 19, 2017 Boa tarde amigo. Tenta assim: SELECT DISTINCT Clientes.cod, Clientes.nome, NF.nfe, max(NF.dtanfe) from Clientes INNER JOIN NF ON Clientes.cod = NF.codigoDoCliente ORDER BY Clientes.cod; Na cláusula ON : Substituir pelos campos de relacionamento das suas tabelas. Na cláusula ORDER BY: Substituir pelo campo que queira ordenar. Abraço. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.