- Este tópico contém 4 respostas, 4 vozes e foi atualizado pela última vez 16 anos, 3 meses atrás por
Itimura.
-
AutorPosts
-
18 de novembro de 2009 às 7:51 pm #90973
Itimura
Participanteolá pessoal, de ante-mão ja parabenizo a todos, buscando por respostas antes de criar este vi o pessoal empenhado em tentar ajudar, meu caso é simples mas não condigo conciliar minha dúvida no oracle
vamos lá
Minha query funciona! ela me traz os dados que preciso, mas como não é pra mim este relatório preciso “maquiar” um pouquinho
Minha Query:
SELECT
MOV.CODCLI AS COD_CLIENTE,
MOV.CODFORNEC AS COD_FORNECEDOR,
SUM(MOV.QT * MOV.PTABELA) AS VALOR_VENDAFROM PCMOV MOV, PCCLIENT CLI
WHERE
MOV.CODCLI IN (SELECT CODCLI FROM PCCLIENT WHERE CODUSUR1 = 93)
AND MOV.CODFORNEC != 0
AND MOV.DTMOV BETWEEN '01102009' AND '31102009'GROUP BY MOV.CODFORNEC
ORDER BY MOV.CODCLI
Legal, agora vem a maquiagem, o nome do cliente, o nome do fornecedor… etc…
pela lógica do Group By eu devo colocar os mesmos campos que eu coloquei no select, mas deve ter outra forma para trazer o nome do cliente e os outros campos que quero sem a necessidade de informa-lo no group by
porque vocês ja devem saber se eu coloca-los la, minha query que trazia dados realsi vai trazer dados que não serão os corretos,
pela lógica que eu imaginaria seria essa:
SELECT
MOV.CODCLI AS COD_CLIENTE,
CLI.CLIENTE AS NOME_CLIENTE,
CLI.ENDERENT AS ENDERECO,
MOV.CODFORNEC AS COD_FORNECEDOR,
FORNEC.FORNECEDOR AS FORNECEDOR,
SUM(MOV.QT * MOV.PTABELA) AS VALOR_VENDAFROM PCMOV MOV, PCCLIENT CLI, PCFORNEC FORNEC
WHERE
MOV.CODCLI = CLI.CODCLI
AND MOV.CODFORNEC = FORNEC.CODFORNEC
AND MOV.CODCLI IN (SELECT CODCLI FROM PCCLIENT WHERE CODUSUR1 = 93)
AND MOV.CODFORNEC != 0
AND MOV.DTMOV BETWEEN '01102009' AND '31102009'GROUP BY MOV.CODFORNEC, MOV.CODCLI
ORDER BY MOV.CODCLI
mas ai ele reclama que eu não coloquei eles no Group By
Resolvo isso com um Union?
18 de novembro de 2009 às 9:28 pm #90982fsitja
ParticipanteDeveria trazer os dados corretos se você colocar os nomes no group by, a menos que a junção tenha buscado 2 nomes (ou nenhum nome) para fornecedor, por exemplo.
Se o caso for que não tem correspondente na tabela de nomes, tente um left outer join. Se estiver vindo mais de uma linha, verifique o relacionamento entre as tabelas, se não está faltando uma coluna no where para ligar.
Fora isso, o que você poderia fazer é colocar sua query versão funcionando como sub-query na sua query “versão cosmética”, no from dela, fazendo join com a tabela de nomes.
SELECT MOVCLI.COD_CLIENTE,
MOVCLI.COD_FORNECEDOR,
FORNEC.FORNECEDOR,
MOVCLI.VALOR_VENDA
FROM (
SELECT
MOV.CODCLI AS COD_CLIENTE,
MOV.CODFORNEC AS COD_FORNECEDOR,
SUM(MOV.QT * MOV.PTABELA) AS VALOR_VENDA
FROM PCMOV MOV, PCCLIENT CLI
WHERE
MOV.CODCLI IN (SELECT CODCLI FROM PCCLIENT WHERE CODUSUR1 = 93)
AND MOV.CODFORNEC != 0
AND MOV.DTMOV BETWEEN '01102009' AND '31102009'
GROUP BY MOV.CODFORNEC) movcli
LEFT JOIN PCFORNEC FORNEC ON FORNEC.CODFORNEC = MOVCLI.COD_FORNECEDORFiquei com uma dúvida. No where você compara MOV.DTMOV com strings ‘01102009’. Esse campo é data ou é varchar2? Se for data, use to_date(‘01102009’, ‘DDMMYYYY’) na comparação para evitar erros caso a configuração de NLS_DATE_FORMAT seja alterada no servidor.
18 de novembro de 2009 às 9:33 pm #90983Leonardo Litz
ParticipanteCara, tenta fazer assim:
SELECT SUM(A.QT * A.PTABELA) AS VALOR_VENDA,
COD_CLIENTE,
COD_FORNECEDOR
FROM (
SELECT
MOV.CODCLI AS COD_CLIENTE,
MOV.CODFORNEC AS COD_FORNECEDOR,
MOV.QT ,
MOV.PTABELAFROM PCMOV MOV, PCCLIENT CLI WHERE MOV.CODCLI IN (SELECT CODCLI FROM PCCLIENT WHERE CODUSUR1 = 93) AND MOV.CODFORNEC != 0 AND MOV.DTMOV BETWEEN '01102009' AND '31102009' ) AGROUP BY COD_FORNECEDOR
ORDER BY COD_CLIENTE
Mas a melhor forma de vc fazer isso é criando um view e dando permissão somente de select nela para o usuário.
Vlw Leonardo Litz
19 de novembro de 2009 às 1:31 am #90988burga
ParticipanteOi Itimura,
Me desculpe mas eu não entendi porque colocando os demais campos no group by vai fazer com que os dados se tornem incorretos, se você precisa apresentar esses dados, supondo que o banco esteja fazendo a consistência corretamente…
Caso seja porque pode ocorrer de não existir o fornecedor ou cliente, você pode usar o left outer join, como o fsitja já disse…
Se as mensagens do fsitja e do Leonardo ainda não ajudarem, você poderia explicar um pouco melhor o que você espera como retorno e porque se colocar no group by todos os campos que você precisa retornar faz com que os dados retornem de forma errada… 😀
19 de novembro de 2009 às 4:14 pm #90993Itimura
Participantegalera, me desculpe, por algum motivo ou erro de digitação eu não estava conseguindo os dados que eu queria, falha minha como o BURGA disse, eu revi minha query, e acertei o que estava errado em um relacionamento entre as tabelas
o fato de eu colocar todos os campos do select dentro do Group by eu pensava que traria dados errados, com inconsistencia de não existir os mesmos nas outras tabelas.
enfim, minha query ficou assim:
SELECT
MOV.CODCLI AS COD_CLIENTE,
CLI.CLIENTE AS NOME_CLIENTE,
CLI.ENDERENT AS ENDERECO,
CLI.BAIRROENT AS BAIRRO,
CLI.ESTENT AS CIDADE,
CLI.DTULTCOMP AS UCOMPRA,
CLI.BLOQUEIO AS BLOQUEADO,
MOV.CODFORNEC AS COD_FORNECEDOR,
FORNEC.FORNECEDOR AS FORNECEDOR,
SUM(MOV.QT * MOV.PTABELA) AS VALOR_VENDAFROM PCMOV MOV, PCCLIENT CLI, PCFORNEC FORNEC WHERE MOV.CODCLI = CLI.CODCLI AND MOV.CODFORNEC = FORNEC.CODFORNEC AND MOV.CODCLI IN (SELECT CODCLI FROM PCCLIENT WHERE CODUSUR1 = 93) AND MOV.CODFORNEC != 0 AND MOV.DTMOV BETWEEN '01102009' AND '31102009'GROUP BY
MOV.CODFORNEC,
MOV.CODCLI,
CLI.CLIENTE,
CLI.ENDERENT,
FORNEC.FORNECEDOR,
CLI.BAIRROENT,
CLI.ESTENT,
CLI.DTULTCOMP,
CLI.BLOQUEIO
ORDER BY MOV.CODCLIDESCULPEM PELA FALHA!mas agradecido!
Obrigado a todos
-
AutorPosts
- Você deve fazer login para responder a este tópico.