none
Ajuda com Comando SQL RRS feed

  • Pergunta

  • Boa tarde 

    Tenho as seguintes tabela de nome

    FUNCIONARIO: Onde nela tem os campos FUNCOD(Codigo do funcionario) e FUNDES(Nome do funcionario)

    ITEVDA: Onde tenho o campo PROCOD(Codigo do produto) / TRNDAT (Data da venda) e também tenho o FUNCOD( Nome do funcionario)

    Gostaria de uma ajuda para montar o seguinte select

    Mostrar quantas vezes o produto 9117 foi vendido, e quais os funcionarios que venderam ele

    Aí na listagem tem que trazer todos os operadores de caixa que vendeu o produto e a quantidade desse produto

    Ex:

    Funcionário: Dyego

    Vendeu: 10 (quantidade de vezes que vendeu o produto)

    Data: 04.01.2019

    Funcionario: Thais

    Vendeu 20

    Data: 05.01.2019

    No caso o filtro de data seria de 04.01.2019 ate 07.01.2019

    Agradeço desde ja

     

    segunda-feira, 7 de outubro de 2019 18:09

Respostas

  • Dei um select na tabela
    (...)

    Nesse trecho que listou as linhas estão com FUNCOD zerado. Na tabela FUNCIONARIO há alguma linha com FUNCOD zerado?

    ---

    Somente para fins de testes você poderia executar o seguinte código?

    -- código #2
    SELECT PROCOD, FUNCOD, count(*) as Vezes 
      from ITEVDA
      where cast (TRNDAT as date) between convert (date, '04.10.2019', 103)  and convert (date, '07.10.2019', 103)
            and PROCOD = '00000000009117'
      group by PROCOD, FUNCOD;
    Ele faz o agrupamento por FUNCOD mas sem tentar obter o nome do funcionário. 

    ---

    Se na execução do código #2 o retorno for uma única linha e com FUNCOD zerado, então o código de funcionário não pode ser coletado na tabela ITEVDA mas provavelmente na tabela TRANSACAO.

     

    -- código #3
    SELECT IV.PROCOD, V.FUNCOD, count(*) as Vezes
    
      from ITEVDA as IV
         inner join TRANSACAO as V on V.TRNSEQ = IV.TRNSEQ
    
      where cast (V.TRNDAT as date) between convert (date, '04.10.2019', 103) and convert (date, '07.10.2019', 103)
            and IV.PROCOD = '00000000009117' 
            and V.TRNTIP = '1'
    
      group by IV.PROCOD, V.FUNCOD;

     

    Se o código #3 retornar informação consistente, então basta transformá-lo na CTE aggVenda e então obter o nome do funcionário:

    -- código #3 v2
    with aggVenda as (
    SELECT IV.PROCOD, V.FUNCOD, count(*) as Vezes
      from ITEVDA as IV
         inner join TRANSACAO as V on V.TRNSEQ = IV.TRNSEQ
      where cast (V.TRNDAT as date) between convert (date, '04.10.2019', 103) and convert (date, '07.10.2019', 103)
            and IV.PROCOD = '00000000009117' 
            and V.TRNTIP = '1'
      group by IV.PROCOD, V.FUNCOD
    )
    SELECT aV.PROCOD, F.FUNDES, aV.FUNCOD, aV.Vezes
      from aggVenda as aV
           inner join FUNCIONARIO as F on F.FUNCOD = aV.FUNCOD
      order by aV.PROCOD, F.FUNDES;

     


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Marcado como Resposta Dyego Rodrigues terça-feira, 8 de outubro de 2019 18:11
    • Editado José Diz terça-feira, 8 de outubro de 2019 18:29
    terça-feira, 8 de outubro de 2019 10:32
  • Dyego, Então, mas neste caso, você não vai conseguir trazer o que esta querendo, ao invês de utilizar o Inner Join na junção utilize o Left Join.

    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    • Marcado como Resposta Dyego Rodrigues terça-feira, 8 de outubro de 2019 18:12
    segunda-feira, 7 de outubro de 2019 21:58

Todas as Respostas

  • Dyego, a quantidade de vezes em que o funcionário vendeu o produto deve ser separado por data?

    Como está declarada a coluna TRNDAT?

    ---

    Eis sugestão:

    -- código #1
    with aggVenda as (
    SELECT PROCOD, FUNCOD, TRNDAT, count(*) as Vezes 
      from ITEVDA
      where TRNDAT between convert (date, '04.01.2019', 103)  and convert (date, '07.01.2019', 103)
    and PROCOD = 9117
    group by PROCOD, FUNCOD, TRNDAT ) SELECT V.PROCOD, F.FUNDES, V.FUNCOD, V.TRNDAT, V.Vezes from aggvenda as V inner join FUNCIONARIO as F on F.FUNCOD = V.FUNCOD order by PROCOD, FUNDES, TRNDAT;

    Não testei; pode conter erro(s).

    O código acima considera que TRNDAT está declarada como date.; caso esteja como datetime basta alterar
        where TRNDAT between ...
    por
       where cast (TRNDAT as date) between ...

    O código acima está preparado para retornar resultado de vários produtos; basta alterar o filtro de PROCOD, na CTE aggVenda.

     

    Lembre-se de marcar esta resposta se ela te ajudou a resolver o problema.


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José Diz segunda-feira, 7 de outubro de 2019 19:15
    • Sugerido como Resposta José Diz terça-feira, 8 de outubro de 2019 18:30
    segunda-feira, 7 de outubro de 2019 18:22
  • Dyego,

    Vou tentar te ajudar, mas antes de apresentar um exemplo, gostaria somente de entender.

    - Você destacou que na Tabela ITEVDA existe o nome do Funcionário e não o Código dele? É isso mesmo? Se for recomendo recompensar nesta forma de relação, pois relacionar tabelas através de um campo caracterer não é uma das melhores práticas, muito menos a mais indicada.

    Quando pensamos em relacionamento, estamos fazendo uma ligação entre duas ou mais tabelas que através de um elemento Chave, denominado Chave Primária e Chave Estrangeira estamos este vínculo, neste caso, utilizando o campo Nome, estamos quebrando totalmente alguns conceitos de integridade referencial e principalmente a unicidade dos dados.

    Agora se somente foi uma referência que você colocou no seu post para ilustrar o que deseja de retorno, eu compreendo.

    Vou apresentar um exemplo com base no que você solicitou:

    -- Criando as Tabelas -- Create Table Funcionarios (FunCod Int Primary Key Identity(1,1), FunDes Varchar(100) Not Null) Go Create Table Produtos (ProdCod Int Primary Key Identity(1,1), DesProd Varchar(100)) Go Create Table ITEVDA (CodITEVDA Int Primary Key Identity(1,1), ProdCod Int Not Null, TRNDAT Date Not Null, FunCod Int Not Null) Go -- Estabelecendo os relacionamentos físicos -- Alter Table ITEVDA Add Constraint [FK_ProdCod_Produtos] Foreign Key (ProdCod) References Produtos(ProdCod) Go Alter Table ITEVDA Add Constraint [FK_FunCod_Funcionarios] Foreign Key (FunCod) References Funcionarios(FunCod) Go -- Inserindo os Dados -- Insert Into Funcionarios Values ('Dyego'),('Thays') Go Insert Into Produtos Values ('Produto 1'),('Produto 2'),('Produto 9117') Go Insert Into ITEVDA (ProdCod, TRNDAT, FunCod) Values (1,GetDate(),1), (1,GetDate(),2), (1,GetDate()+2,2), (2,GetDate()+2,1), (2,GetDate()+4,2), (2,GetDate()+4,2), (3,GetDate(),2), (3,GetDate()+2,1) Go -- Apresentando os Dados -- Select F.FunDes As 'Nome do Funcionário',

    I.TRNDAT As 'Data Venda', Count(P.ProdCod) As Quantidade From ITEVDA I Inner Join Funcionarios F On I.FunCod = F.FunCod Inner Join Produtos P On I.ProdCod = P.ProdCod

    Where I.TRNDAT Between '2019-10-07' And '2019-10-08'

    Group By F.FunDes, I.TRNDAT Order By F.FunDes Go

    Veja o esboco do resultado obtido:

    Espero ter ajudado, este é somente um exemplo, uma possibilidade de resultado.

    Não estou considerando especificamente o produto 9117, note que na minha claúsula Where, declarei somente o filtro para a Data, mas você vai poder fazer uso da mesma e adicionar o Código do Produto conforme eu complemento abaixo:

    Select F.FunDes As 'Nome do Funcionário', 
               I.TRNDAT As 'Data Venda', 
               Count(P.ProdCod) As Quantidade
    From ITEVDA I Inner Join Funcionarios F
                                           On I.FunCod = F.FunCod
    									  Inner Join Produtos P
    									   On I.ProdCod = P.ProdCod
    Where I.TRNDAT Between '2019-10-07' And '2019-10-08'
    And I.ProdCod = 9117 -- Informando o Código do produto
    Group By F.FunDes, I.TRNDAT
    Order By F.FunDes
    Go

    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]


    segunda-feira, 7 de outubro de 2019 18:35
  • Não precisa ser separado por data

    Basta mostrar o codigo, o nome do funcionario e a quantidade de vezes que o produto em questão foi vendido

    Porem esse codigo não me mostra nada

    E existe venda desse produto nessa data

    segunda-feira, 7 de outubro de 2019 18:36
  • Junior, acho que escrevi errado então, 

    na tabela itevda tem o codigo somente não tem o nome do funcionario 

    o nome somente na tabela funcionario

    segunda-feira, 7 de outubro de 2019 18:37
  • Junior, acho que escrevi errado então, 

    na tabela itevda tem o codigo somente não tem o nome do funcionario 

    o nome somente na tabela funcionario

    Dyego,

    Sim, foi o que eu imagine, mas verifique se o exemplo que nós compartilhamos poderá lhe ajudar.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    segunda-feira, 7 de outubro de 2019 18:40
  • Não precisa ser separado por data
    Basta mostrar o codigo, o nome do funcionario e a quantidade de vezes que o produto em questão foi vendido

    Ok.

    Eis a versão sem data no resultado:

    -- código #1 v2
    with aggVenda as (
    SELECT PROCOD, FUNCOD, count(*) as Vezes 
      from ITEVDA
      where TRNDAT between convert (date, '04.01.2019', 103)  and convert (date, '07.01.2019', 103)
            and PROCOD = 9117
      group by PROCOD, FUNCOD
    )
    SELECT V.PROCOD, F.FUNDES, V.FUNCOD, V.Vezes
      from aggvenda as V
           inner join FUNCIONARIO as F on F.FUNCOD = V.FUNCOD
      order by PROCOD, FUNDES;

    Não testei; pode conter erro(s).

     

    Porem esse codigo não me mostra nada
    E existe venda desse produto nessa data

    "04.01.2019" significa 4 de janeiro ou 1º de abril?

    ---

    Dúvida que permanece: como está declarada a coluna TRNDAT?

     


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José Diz segunda-feira, 7 de outubro de 2019 22:23
    segunda-feira, 7 de outubro de 2019 18:41
  • o select que eu fiz trouxe basicamente isso, porem eu so queria a quantidade, não preciso do numero da transação.

    Tinha feito esse select 

    select DISTINCT(TRANSACAO.TRNSEQ) as NUM_TRANSACAO, COUNT(TRANSACAO.TRNSEQ) AS QTD, FUNCIONARIO.FUNCOD as COD_FUNCIONARIO, FUNCIONARIO.FUNDES as NOME_FUNCIONARIO, TRANSACAO.TRNDAT AS DATA from TRANSACAO
    JOIN FUNCIONARIO ON (TRANSACAO.FUNCOD = FUNCIONARIO.FUNCOD) 
    join ITEVDA on (itevda.TRNSEQ = transacao.TRNSEQ) 
     WHERE TRANSACAO.trndat between '2019/10/04' and '2019/10/07' and PROCOD='00000000009117' 
     AND TRNTIP='1'
     GROUP BY ITEVDA.FUNCOD, FUNCIONARIO.FUNDES, TRANSACAO.TRNSEQ, FUNCIONARIO.FUNCOD, TRANSACAO.TRNDAT
     order by TRANSACAO.TRNDAT asc

    segunda-feira, 7 de outubro de 2019 18:51
  • WHERE TRANSACAO.trndat between '2019/10/04' and '2019/10/07' and PROCOD='00000000009117'

    Dyego, na primeira mensagem deste tópico você citou ..."o filtro de data seria de 04.01.2019 ate 07.01.2019" mas no exemplo acima está de 04.10.2019 até 07.10.2019. Será que o fato de não retornar nenhuma venda deve-se justamente que no código #1 eu utilizei

                            04.01.2019 a 07.01.2019

    mas o que você quer é

                            04.10.2019 a 07.10.2019 ?



    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José Diz segunda-feira, 7 de outubro de 2019 22:03
    segunda-feira, 7 de outubro de 2019 18:57
  • o select que eu fiz trouxe basicamente isso, porem eu so queria a quantidade, não preciso do numero da transação.

    Tinha feito esse select 

    select DISTINCT(TRANSACAO.TRNSEQ) as NUM_TRANSACAO, COUNT(TRANSACAO.TRNSEQ) AS QTD, FUNCIONARIO.FUNCOD as COD_FUNCIONARIO, FUNCIONARIO.FUNDES as NOME_FUNCIONARIO, TRANSACAO.TRNDAT AS DATA from TRANSACAO
    JOIN FUNCIONARIO ON (TRANSACAO.FUNCOD = FUNCIONARIO.FUNCOD) 
    join ITEVDA on (itevda.TRNSEQ = transacao.TRNSEQ) 
     WHERE TRANSACAO.trndat between '2019/10/04' and '2019/10/07' and PROCOD='00000000009117' 
     AND TRNTIP='1'
     GROUP BY ITEVDA.FUNCOD, FUNCIONARIO.FUNDES, TRANSACAO.TRNSEQ, FUNCIONARIO.FUNCOD, TRANSACAO.TRNDAT
     order by TRANSACAO.TRNDAT asc

    Dyego,

    Reescreva o seu Select as colunas que não deseja trazer, como por exemplo o Transacao.TrnSeq, veja se estas alterações podem te nortear:

    Select COUNT(TRANSACAO.TRNSEQ) AS QTD, 
               FUNCIONARIO.FUNCOD as COD_FUNCIONARIO, 
               FUNCIONARIO.FUNDES as NOME_FUNCIONARIO, 
    		   TRANSACAO.TRNDAT AS DATA 
    From TRANSACAO JOIN FUNCIONARIO 
                                   ON (TRANSACAO.FUNCOD = FUNCIONARIO.FUNCOD) 
                                  join ITEVDA on (itevda.TRNSEQ = transacao.TRNSEQ) 
    WHERE TRANSACAO.trndat between '2019/10/04' and '2019/10/07'
    And PROCOD='00000000009117' 
    And TRNTIP='1'
    GROUP BY FUNCIONARIO.FUNCOD, FUNCIONARIO.FUNDES, TRANSACAO.TRNDAT
    Order By TRANSACAO.TRNDAT Asc 

    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    segunda-feira, 7 de outubro de 2019 19:00
  • Da certo, 

    Porem não preciso da data, somente a quantidade, não precisa ser separado por data

    tipo assim

    quantidade  cod       nome

    1                 05         joao

    segunda-feira, 7 de outubro de 2019 19:06
  • Porem não preciso da data, somente a quantidade, não precisa ser separado por data
    tipo assim

    quantidade  cod       nome
    1                 05         joao

    Perfeito.

    -- código #1 v3
    with aggVenda as (
    SELECT PROCOD, FUNCOD, count(*) as Vezes 
      from ITEVDA
      where TRNDAT between convert (datetime, '04.10.2019', 103)  and convert (datetime, '07.10.2019', 103)
            and PROCOD = 9117
      group by PROCOD, FUNCOD
    )
    SELECT V.PROCOD, F.FUNDES, V.FUNCOD, V.Vezes
      from aggvenda as V
           inner join FUNCIONARIO as F on F.FUNCOD = V.FUNCOD
      order by PROCOD, FUNDES;

     



    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José Diz terça-feira, 8 de outubro de 2019 10:40
    segunda-feira, 7 de outubro de 2019 19:07
  • Da certo, 

    Porem não preciso da data, somente a quantidade, não precisa ser separado por data

    tipo assim

    quantidade  cod       nome

    1                 05         joao

    Veja assim então:

    Select COUNT(TRANSACAO.TRNSEQ) AS QTD, 
               FUNCIONARIO.FUNCOD as COD_FUNCIONARIO, 
               FUNCIONARIO.FUNDES as NOME_FUNCIONARIO 
    From TRANSACAO JOIN FUNCIONARIO 
                                   ON (TRANSACAO.FUNCOD = FUNCIONARIO.FUNCOD) 
                                  join ITEVDA on (itevda.TRNSEQ = transacao.TRNSEQ) 
    WHERE TRANSACAO.trndat between '2019/10/04' and '2019/10/07'
    And PROCOD='00000000009117' 
    And TRNTIP='1'
    GROUP BY FUNCIONARIO.FUNCOD, FUNCIONARIO.FUNDES
    

    Mas neste caso, o resultado não será separado pela Data, a contagem será feita de uma forma geral.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]


    segunda-feira, 7 de outubro de 2019 19:08
  • Não entendo o porque Jose, mas esse código não me retorna nada
    segunda-feira, 7 de outubro de 2019 19:09
  • Não entendo o porque Jose, mas esse código não me retorna nada

    No enunciado inicial você citou que PROCOD seria 9117 mas em um código que postou está '00000000009117'. Isto já é o suficiente para não retornar nada.


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José Diz segunda-feira, 7 de outubro de 2019 22:04
    segunda-feira, 7 de outubro de 2019 19:12
  • Sim jose, eu ja havia feito essa alteração

    Foi a primeira coisa que fiz antes de rodar o comando, o codigo é de 14 digitos 00000000009117

    dei o exemplo de 9117 so como exemplo mesmo, mas iria alterar

    porem mesmo alterando para o correto essse codigo não me retorna nada, ja o que postei ali que eu tinha feito e o Junior ajustou alguns pontos da certo

    porem como disse so queria isso 

    quantidade  cod       nome

    1                 05         joao

    segunda-feira, 7 de outubro de 2019 19:15
  • Dyego,

    Você tem certeza que este produto possui estes movimentações de venda?

    Faz um teste, execute o seu Select sem filtrar o período de datas, verifique qual será o resultado.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    segunda-feira, 7 de outubro de 2019 19:18
  • Dei um select na tabela


    segunda-feira, 7 de outubro de 2019 19:22
  • Ai ele da um select em uma tabela de nome TRANSACAO

    Onde também guarda as vendas, e a tabela ITEVA, guarda os itens de cada transação

    ou seja a tabela transação não tem codigo de produto, somente na tabela itevda

    segunda-feira, 7 de outubro de 2019 19:25
  • Dyego, Então, mas neste caso, você não vai conseguir trazer o que esta querendo, ao invês de utilizar o Inner Join na junção utilize o Left Join.

    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    • Marcado como Resposta Dyego Rodrigues terça-feira, 8 de outubro de 2019 18:12
    segunda-feira, 7 de outubro de 2019 21:58
  • Dei um select na tabela
    (...)

    Nesse trecho que listou as linhas estão com FUNCOD zerado. Na tabela FUNCIONARIO há alguma linha com FUNCOD zerado?

    ---

    Somente para fins de testes você poderia executar o seguinte código?

    -- código #2
    SELECT PROCOD, FUNCOD, count(*) as Vezes 
      from ITEVDA
      where cast (TRNDAT as date) between convert (date, '04.10.2019', 103)  and convert (date, '07.10.2019', 103)
            and PROCOD = '00000000009117'
      group by PROCOD, FUNCOD;
    Ele faz o agrupamento por FUNCOD mas sem tentar obter o nome do funcionário. 

    ---

    Se na execução do código #2 o retorno for uma única linha e com FUNCOD zerado, então o código de funcionário não pode ser coletado na tabela ITEVDA mas provavelmente na tabela TRANSACAO.

     

    -- código #3
    SELECT IV.PROCOD, V.FUNCOD, count(*) as Vezes
    
      from ITEVDA as IV
         inner join TRANSACAO as V on V.TRNSEQ = IV.TRNSEQ
    
      where cast (V.TRNDAT as date) between convert (date, '04.10.2019', 103) and convert (date, '07.10.2019', 103)
            and IV.PROCOD = '00000000009117' 
            and V.TRNTIP = '1'
    
      group by IV.PROCOD, V.FUNCOD;

     

    Se o código #3 retornar informação consistente, então basta transformá-lo na CTE aggVenda e então obter o nome do funcionário:

    -- código #3 v2
    with aggVenda as (
    SELECT IV.PROCOD, V.FUNCOD, count(*) as Vezes
      from ITEVDA as IV
         inner join TRANSACAO as V on V.TRNSEQ = IV.TRNSEQ
      where cast (V.TRNDAT as date) between convert (date, '04.10.2019', 103) and convert (date, '07.10.2019', 103)
            and IV.PROCOD = '00000000009117' 
            and V.TRNTIP = '1'
      group by IV.PROCOD, V.FUNCOD
    )
    SELECT aV.PROCOD, F.FUNDES, aV.FUNCOD, aV.Vezes
      from aggVenda as aV
           inner join FUNCIONARIO as F on F.FUNCOD = aV.FUNCOD
      order by aV.PROCOD, F.FUNDES;

     


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Marcado como Resposta Dyego Rodrigues terça-feira, 8 de outubro de 2019 18:11
    • Editado José Diz terça-feira, 8 de outubro de 2019 18:29
    terça-feira, 8 de outubro de 2019 10:32
  • Dei um select na tabela
    (...)

    Nesse trecho que listou as linhas estão com FUNCOD zerado. Na tabela FUNCIONARIO há alguma linha com FUNCOD zerado?

    ---

    Somente para fins de testes você poderia executar o seguinte código?

    -- código #2
    SELECT PROCOD, FUNCOD, count(*) as Vezes 
      from ITEVDA
      where cast (TRNDAT as date) between convert (date, '04.10.2019', 103)  and convert (date, '07.10.2019', 103)
            and PROCOD = '00000000009117'
      group by PROCOD, FUNCOD;
    Ele faz o agrupamento por FUNCOD mas sem tentar obter o nome do funcionário. 

    ---

    Se na execução do código #2 o retorno for uma única linha e com FUNCOD zerado, então o código de funcionário não pode ser coletado na tabela ITEVDA mas provavelmente na tabela TRANSACAO.

     

    -- código #3
    SELECT IV.PROCOD, V.FUNCOD, count(*) as Vezes
    
      from ITEVDA as IV
         inner join TRANSACAO as V on V.TRNSEQ = IV.TRNSEQ
    
      where cast (V.TRNDAT as date) between convert (date, '04.10.2019', 103) and convert (date, '07.10.2019', 103)
            and IV.PROCOD = '00000000009117' 
            and V.TRNTIP = '1'
    
      group by IV.PROCOD, V.FUNCOD;

     

    Se o código #3 retornar informação consistente, então basta transformá-lo na CTE aggVenda e então obter o nome do funcionário:

    -- código #3 v2
    with aggVenda as (
    SELECT IV.PROCOD, V.FUNCOD, count(*) as Vezes
      from ITEVDA as IV
         inner join TRANSACAO as V on V.TRNSEQ = IV.TRNSEQ
      where cast (V.TRNDAT as date) between convert (date, '04.10.2019', 103) and convert (date, '07.10.2019', 103)
            and IV.PROCOD = '00000000009117' 
            and V.TRNTIP = '1'
      group by IV.PROCOD, V.FUNCOD
    )
    SELECT aV.PROCOD, F.FUNDES, aV.FUNCOD, aV.Vezes
      from aggVenda as aV
           inner join FUNCIONARIO as F on F.FUNCOD = aV.FUNCOD
      order by aV.PROCOD, F.FUNDES;

     

    Lembre-se de marcar esta resposta se ela te ajudou a resolver o problema.


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    Na verdade esqueci de ver, que a tabela que armazena o funcod correto é a tabela transacao na itevda o funcod pelo que vi vai sempre zerado mesmo.

    mas deu certo muito obrigado

    terça-feira, 8 de outubro de 2019 18:11
  • Na verdade esqueci de ver, que a tabela que armazena o funcod correto é a tabela transacao na itevda o funcod pelo que vi vai sempre zerado mesmo.
    mas deu certo muito obrigado

    Ok, Dyego.

    Como o código #1 não retornava nada, e depois que você publicou amostra da tabela ITEVDA, desconfiei disso. Para ter certeza disso o código #2 foi criado e, pelo que você informa, estava tudo zerado.

    Assim, o código #3 v2 resolveu a necessidade, ao utilizar a tabela TRANSACAO para obter o código do funcionário.


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]



    • Editado José Diz terça-feira, 8 de outubro de 2019 18:36
    terça-feira, 8 de outubro de 2019 18:34