none
Não repetir o valor do campo RRS feed

  • Pergunta

  • Olá Pessoal.

    Estou precisando de uma ajuda. Sou novo em SQL.

    Tenho a seguinte situação:

    Preciso que o estoque venha só uma vez para cada item.

    O DISTINCT não funciona pois a linha não é igual.




    • Editado JukaCampos quarta-feira, 1 de julho de 2020 12:41
    quarta-feira, 1 de julho de 2020 12:32

Respostas

  • Sendo o SQL Server 2008, segue uma sugestão utilizando a função Row_Number para poder identificar a primeira linha do item e assim retornar o valor para a coluna Estoque:

    with CTE_RN as
    (
        select
            row_number() over(partition by Item order by Pedido, DataEntrega) as RN,
            -- colunas da query atual...
    
        from -- restante da query atual...
    )
    
    select
        Pedido,
        Item,
        Qtde,
        case when RN = 1 then Estoque else 0 end as Estoque,
        Cliente.
        DataEntrega
    from CTE_RN
    

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta JukaCampos quarta-feira, 8 de julho de 2020 10:24
    sexta-feira, 3 de julho de 2020 18:47
  • Junior.

    Veja abaixo, por favor.

    with CTE_RN as
    (
        SELECT
              row_number() over(partition by T1.ItemCode order by T1.ItemCode, T1.ShipDate) as RN,
              T1.ShipDate 'Entrega',
              T0.DocDate 'Dt Pedido',
              T0.DocEntry 'Pedido',
              T0.CARDNAME 'Razão Social',
              T1.ItemCode,
              T1.Quantity 'Quantidade',
              T1.OpenCreQty 'Saldo Qtde',
              T4.OnHand 'Estoque'

       FROM ORDR T0 INNER JOIN RDR1 T1 ON T0.[DocEntry] = T1.[DocEntry]
                               INNER JOIN OITM T2 ON T1.[ItemCode] = T2.[ItemCode]
                               INNER JOIN OITB T3 ON T2.[ItmsGrpCod] = T3.[ItmsGrpCod]
                               INNER JOIN OITW T4 ON T2.ItemCode = T4.ItemCode

       WHERE
              T1.LineStatus = 'O' AND
              T1.Price > 0 AND
              T1.LineTotal > 0 AND
              T4.WhsCode = 'PA' AND
              T3.ItmsGrpNam Like 'A%%' AND
              T1.ShipDate <= [%1]

       GROUP BY
                 T1.ItemCode,
                 T1.ShipDate,
                 T1.OpenCreQty,
                 T3.ItmsGrpNam,
                 T4.OnHand,
                 T0.CARDNAME,
                 T0.DocDate,
                 T1.Dscription,
                 T0.DocEntry,
                 T1.Quantity
    )

    SELECT DISTINCT
              T1.ShipDate 'Entrega',
              T0.DocDate 'Dt Pedido',
              T0.DocEntry 'Pedido',
              T0.CARDNAME 'Razão Social',
              T1.ItemCode,
              T1.Quantity 'Quantidade',
              T1.OpenCreQty 'Saldo Qtde',
              case when RN = 1 then T4.OnHand else 0 end 'Estoque',
              T4.OnHand 'Em Estoque'

    FROM CTE_RN

    Obrigado.

    • Marcado como Resposta JukaCampos quarta-feira, 8 de julho de 2020 10:25
    segunda-feira, 6 de julho de 2020 15:43
  • Para evitar esses erros você tem que remover os aliases de dentro da CTE ou então utilizar os aliases e não o nome original das colunas na parte posterior a CTE. Na sugestão abaixo removi os aliases de dentro da CTE e mantive os nomes originais das colunas:

    with CTE_RN as
    (
        SELECT
              row_number() over(partition by T1.ItemCode order by T1.ShipDate) as RN,
              T1.ShipDate,
              T0.DocDate,
              T0.DocEntry,
              T0.CARDNAME,
              T1.ItemCode,
              T1.Quantity,
              T1.OpenCreQty,
              T4.OnHand 'Estoque'
    
       FROM ORDR T0 INNER JOIN RDR1 T1 ON T0.[DocEntry] = T1.[DocEntry]
                               INNER JOIN OITM T2 ON T1.[ItemCode] = T2.[ItemCode]
                               INNER JOIN OITB T3 ON T2.[ItmsGrpCod] = T3.[ItmsGrpCod]
                               INNER JOIN OITW T4 ON T2.ItemCode = T4.ItemCode
    
       WHERE
              T1.LineStatus = 'O' AND
              T1.Price > 0 AND
              T1.LineTotal > 0 AND
              T4.WhsCode = 'PA' AND
              T3.ItmsGrpNam Like 'A%%' AND
              T1.ShipDate <= [%1]
    
       GROUP BY
                 T1.ItemCode,
                 T1.ShipDate,
                 T1.OpenCreQty,
                 T3.ItmsGrpNam,
                 T4.OnHand,
                 T0.CARDNAME,
                 T0.DocDate,
                 T1.Dscription,
                 T0.DocEntry,
                 T1.Quantity
    )
    
    SELECT 
              T1.ShipDate 'Entrega',
              T0.DocDate 'Dt Pedido',
              T0.DocEntry 'Pedido',
              T0.CARDNAME 'Razão Social',
              T1.ItemCode,
              T1.Quantity 'Quantidade',
              T1.OpenCreQty 'Saldo Qtde',
              case when RN = 1 then T4.OnHand else 0 end 'Estoque',
              T4.OnHand 'Em Estoque'
    
    FROM CTE_RN

    Não tem relação com o problema, mas pelo que vi a coluna ItemCode não é necessária no Order By da Row_Number e desconfio que o Distinct também não. Avalie também se o Group By é necessário dentro da CTE.

    obs: não sei se você estava interagindo com o Junior ou comigo; se era comigo meu nome de usuário não é Junior

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br


    • Editado gapimex segunda-feira, 6 de julho de 2020 17:35
    • Sugerido como Resposta Junior Galvão - MVPMVP segunda-feira, 6 de julho de 2020 23:28
    • Marcado como Resposta JukaCampos quarta-feira, 8 de julho de 2020 10:25
    segunda-feira, 6 de julho de 2020 17:34
  • JukaCampos,

    Analisando os dados que você esta apresentando, mesmo aplicando o Distinct teremos a duplicidade de dados, pois a coluna Cliente acaba forçando este retorno.

    Gostaria de entender se realmente você precisa listar a coluna Item?

    Como também, o que existe de diferente entre quantidade e estoque?

    Aparentemente nos seus totais, a soma das quantidades esta sendo feita de forma geral, independente do item ou cliente, já Estoque você destaca na imagem que a soma será por cliente mediante ao seu estoque.

    Pois bem, poderia nos dizer, para quem sabe podemos pensar em fazer uso da cláusula group by para agrupar os dados em conjunto com a função SUM() estabelecendo as respectivas somas.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | 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 JukaCampos quarta-feira, 8 de julho de 2020 10:23
    quarta-feira, 1 de julho de 2020 18:56
  • Olá Junior. Obrigado pelo interesse.

    Sim. Preciso listar os itens.

    A Qtde é o que eu tenho de pedido colocado par cada item e o mesmo item pode ser de cliente diferente.

    O Estoque é o que eu já tenho pronto para entrega. O valor do estoque do item está repetindo, pois o item tem mais de um pedido. O total do estoque é a soma do estoque de cada item apenas uma vez para cada item.

    Ou seja: Par o item 1 eu só tenho 5 peças  e não 10. E para o item 2 eu só tenho 100 peças e não 200.

    • Marcado como Resposta JukaCampos quarta-feira, 8 de julho de 2020 10:24
    quinta-feira, 2 de julho de 2020 12:03
  • Juka,

    Obrigado pelo retorno, pois bem, a quantidade vai ser um valor total do que você tem na sua previsão de vendas, sem crise!

    O estoque é o que já esta definido, é justamente ai que temos que analisar, os itens pertencem a um pedido, sendo que o pedido tem o produto e seus respectivo cliente e até mesmo o vendedor.

    Acredito que devemos trazer para esta query, o número do pedido, e desta forma poderemos então, fazer justamente as somas dos itens.

    O que você acha?


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | 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 JukaCampos quarta-feira, 8 de julho de 2020 10:24
    quinta-feira, 2 de julho de 2020 22:50
  • Junior.

    Uma coluna que não coloquei é o da "Data de Entrega'.

    Neste relatório eu preciso listar os pedidos e os itens de cada pedido e a Data de entrega.

    A data de entrega é deferente para cada item do cliente.

    Portando eu não posso trazer os valores somados para cada item, pois preciso mostrar a data de entrega e o cliente que pode ser, também, diferente para o mesmo item.

    Preciso mesmo é exibir o estoque só uma vez para cada item independente dos outros dados da linha. Pois o estoque pertence ao item

    Veja outro exemplo :


    Obrigado.

    Deus te abençoe.



    • Editado JukaCampos sexta-feira, 3 de julho de 2020 12:50
    • Marcado como Resposta JukaCampos quarta-feira, 8 de julho de 2020 10:24
    sexta-feira, 3 de julho de 2020 12:25
  • JukaCampos,

    Tomei como base este seu último exemplo, sinceramente não sei dizer se esta certo:

    -- Criando a Tabela Movimentacao -- Create Table Movimentacao (Pedido Int, Item Int, QTDE Int, Estoque Int, Cliente Char(1), DataEntrega Date) Go -- Inserindo os dados -- Insert Into Movimentacao Values (1, 1, 10, 5, 'a', '2020-08-03'), (1, 1, 30, 5, 'a', '2020-08-15'), (2, 1, 50, 100, 'b', '2020-08-03'), (3, 1, 30, 0, 'c', '2020-08-12'), (4, 2, 40, 80, 'd', '2020-08-04'), (5, 2, 30, 0, 'e', '2020-08-10'), (1, 2, 20, 0, 'a', '2020-08-18'), (2, 2, 50, 0, 'b', '2020-08-18') Go -- Consultando -- Select * From Movimentacao Go -- CTEItemPorLinha -- ;With CTEItemPorLinha (Estoque) As ( Select Distinct Estoque From Movimentacao ) -- Apresentando os Dados -- Select Distinct M.Pedido, M.Item, M.QTDE, IsNull(Lead(C.Estoque,1) Over (Partition By M.Pedido Order By M.Pedido),0) As Estoque, M.Cliente, M.DataEntrega From Movimentacao M Inner Join CTEItemPorLinha C On M.Estoque = C.Estoque Go -- Totais -- ;With CTESomaEstoquePorItem (SomaEstoque) As (Select Distinct Estoque From Movimentacao) Select 'Totais -->' As ' ', (Select SUM(QTDE) From Movimentacao) As Quantidade,
    Sum(Soma) As Estoque
    From CTESomaEstoquePorItem
    Go

    Ressalto é somente um exemplo, não garanto que possa ser esta a solução.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | 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 JukaCampos quarta-feira, 8 de julho de 2020 10:24
    sexta-feira, 3 de julho de 2020 14:51
  • Junior.

    Não sei s entendi, mas é o seguinte.

    A Estoque pode ser o mesmo para item diferente.

    Veja exemplo:


    Então não pode Select Distinc para o Estoque.

    Hoje eu tenho isso:

    E eu preciso disso:


    A diferença é apenas o estoque que não repete para o mesmo item.

    Se o próximo item é igual ao anterior o Estoque é = 0


    • Marcado como Resposta JukaCampos quarta-feira, 8 de julho de 2020 10:24
    sexta-feira, 3 de julho de 2020 16:35
  • Boa tarde,

    JukaCampos, acho que é possível conseguir esse resultado através da query, mas acho que isso deveria ser feito de preferência na camada de apresentação dos dados, que no seu caso é o relatório, e pra ser sincero não tenho nenhuma experiência com o Reporting Services, então não sei se é possível obter esse resultado com ele.

    Caso você queira implementar na query mesmo, nos informe qual versão do SQL Server você está utilizando.


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta JukaCampos quarta-feira, 8 de julho de 2020 10:24
    sexta-feira, 3 de julho de 2020 17:36
  • Junior.

    SQL Server 2008

    • Marcado como Resposta JukaCampos quarta-feira, 8 de julho de 2020 10:24
    sexta-feira, 3 de julho de 2020 18:23
  • Junior.

    SQL Server 2008

    Juka,

    Certo, neste caso a função Leag() não vai atender.



    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | 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 JukaCampos quarta-feira, 8 de julho de 2020 10:24
    sexta-feira, 3 de julho de 2020 21:25
  • Sendo o SQL Server 2008, segue uma sugestão utilizando a função Row_Number para poder identificar a primeira linha do item e assim retornar o valor para a coluna Estoque:

    with CTE_RN as
    (
        select
            row_number() over(partition by Item order by Pedido, DataEntrega) as RN,
            -- colunas da query atual...
    
        from -- restante da query atual...
    )
    
    select
        Pedido,
        Item,
        Qtde,
        case when RN = 1 then Estoque else 0 end as Estoque,
        Cliente.
        DataEntrega
    from CTE_RN

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    Juka,

    Acredito que este exemplo do Gapimex possa lhe ajudar.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | 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 JukaCampos quarta-feira, 8 de julho de 2020 10:25
    sexta-feira, 3 de julho de 2020 21:26
  • Olá Junior.

    Está retornando a mensagem:

    1). The multi-part identifier "DataEntrega" could not be bound.

    Essa mesma mensagem aparece para os outras colunas.

    Obrigado.

    • Marcado como Resposta JukaCampos quarta-feira, 8 de julho de 2020 10:25
    segunda-feira, 6 de julho de 2020 13:37
  • Juka, você pode postar a consulta que você tentou executar para verificarmos o que pode estar acontecendo?

    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta JukaCampos quarta-feira, 8 de julho de 2020 10:25
    segunda-feira, 6 de julho de 2020 14:04
  • Desculpa, gapimex.

    Estava interagindo com o Junior.

    Obrigado pela ajuda.

    Consegui resolver colocando a linha:

      'Estoque' = case when row_number() over(partition by T1.ItemCode order by T1.ItemCode, T1.ShipDate, T0.DocDate ) = 1 then T4.OnHand else 0 end,

    direto sem criar a View.

    Mesmo assim sem a sua ajuda eu não ia conseguir.

    Veja o resultado.

    Observe que os item repete, mas o estoque não.

    Muito, mais muito obrigado mesmo.

    Deus te abençoe.

    • Marcado como Resposta JukaCampos quarta-feira, 8 de julho de 2020 10:25
    segunda-feira, 6 de julho de 2020 18:00
  • Desculpa, gapimex.

    Estava interagindo com o Junior.

    Obrigado pela ajuda.

    Consegui resolver colocando a linha:

      'Estoque' = case when row_number() over(partition by T1.ItemCode order by T1.ItemCode, T1.ShipDate, T0.DocDate ) = 1 then T4.OnHand else 0 end,

    direto sem criar a View.

    Mesmo assim sem a sua ajuda eu não ia conseguir.

    Veja o resultado.

    Observe que os item repete, mas o estoque não.

    Muito, mais muito obrigado mesmo.

    Deus te abençoe.

    Juka,

    Que bom que você conseguiu, hoje eu não tive tempo para acessar os fóruns, somente agora no final do dia.

    Com certeza a pronta ajuda do Gapimex foi fundamental para a sua necessidade.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | 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 JukaCampos quarta-feira, 8 de julho de 2020 10:26
    segunda-feira, 6 de julho de 2020 23:29
  • Junior.

    O gapimex me deu uma ajuda e deu certo.

    Muito obrigado pela sua ajuda também.

    Deus te abençoe.

    • Marcado como Resposta JukaCampos quarta-feira, 8 de julho de 2020 10:26
    terça-feira, 7 de julho de 2020 10:43
  • Junior.

    O gapimex me deu uma ajuda e deu certo.

    Muito obrigado pela sua ajuda também.

    Deus te abençoe.

    Juka,

    Não precisa agradecer, estamos aqui para colaborar e sempre aprender.



    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | 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 JukaCampos quarta-feira, 8 de julho de 2020 10:26
    terça-feira, 7 de julho de 2020 17:27

Todas as Respostas

  • JukaCampos,

    Analisando os dados que você esta apresentando, mesmo aplicando o Distinct teremos a duplicidade de dados, pois a coluna Cliente acaba forçando este retorno.

    Gostaria de entender se realmente você precisa listar a coluna Item?

    Como também, o que existe de diferente entre quantidade e estoque?

    Aparentemente nos seus totais, a soma das quantidades esta sendo feita de forma geral, independente do item ou cliente, já Estoque você destaca na imagem que a soma será por cliente mediante ao seu estoque.

    Pois bem, poderia nos dizer, para quem sabe podemos pensar em fazer uso da cláusula group by para agrupar os dados em conjunto com a função SUM() estabelecendo as respectivas somas.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | 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 JukaCampos quarta-feira, 8 de julho de 2020 10:23
    quarta-feira, 1 de julho de 2020 18:56
  • Olá Junior. Obrigado pelo interesse.

    Sim. Preciso listar os itens.

    A Qtde é o que eu tenho de pedido colocado par cada item e o mesmo item pode ser de cliente diferente.

    O Estoque é o que eu já tenho pronto para entrega. O valor do estoque do item está repetindo, pois o item tem mais de um pedido. O total do estoque é a soma do estoque de cada item apenas uma vez para cada item.

    Ou seja: Par o item 1 eu só tenho 5 peças  e não 10. E para o item 2 eu só tenho 100 peças e não 200.

    • Marcado como Resposta JukaCampos quarta-feira, 8 de julho de 2020 10:24
    quinta-feira, 2 de julho de 2020 12:03
  • Juka,

    Obrigado pelo retorno, pois bem, a quantidade vai ser um valor total do que você tem na sua previsão de vendas, sem crise!

    O estoque é o que já esta definido, é justamente ai que temos que analisar, os itens pertencem a um pedido, sendo que o pedido tem o produto e seus respectivo cliente e até mesmo o vendedor.

    Acredito que devemos trazer para esta query, o número do pedido, e desta forma poderemos então, fazer justamente as somas dos itens.

    O que você acha?


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | 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 JukaCampos quarta-feira, 8 de julho de 2020 10:24
    quinta-feira, 2 de julho de 2020 22:50
  • Junior.

    Uma coluna que não coloquei é o da "Data de Entrega'.

    Neste relatório eu preciso listar os pedidos e os itens de cada pedido e a Data de entrega.

    A data de entrega é deferente para cada item do cliente.

    Portando eu não posso trazer os valores somados para cada item, pois preciso mostrar a data de entrega e o cliente que pode ser, também, diferente para o mesmo item.

    Preciso mesmo é exibir o estoque só uma vez para cada item independente dos outros dados da linha. Pois o estoque pertence ao item

    Veja outro exemplo :


    Obrigado.

    Deus te abençoe.



    • Editado JukaCampos sexta-feira, 3 de julho de 2020 12:50
    • Marcado como Resposta JukaCampos quarta-feira, 8 de julho de 2020 10:24
    sexta-feira, 3 de julho de 2020 12:25
  • JukaCampos,

    Tomei como base este seu último exemplo, sinceramente não sei dizer se esta certo:

    -- Criando a Tabela Movimentacao -- Create Table Movimentacao (Pedido Int, Item Int, QTDE Int, Estoque Int, Cliente Char(1), DataEntrega Date) Go -- Inserindo os dados -- Insert Into Movimentacao Values (1, 1, 10, 5, 'a', '2020-08-03'), (1, 1, 30, 5, 'a', '2020-08-15'), (2, 1, 50, 100, 'b', '2020-08-03'), (3, 1, 30, 0, 'c', '2020-08-12'), (4, 2, 40, 80, 'd', '2020-08-04'), (5, 2, 30, 0, 'e', '2020-08-10'), (1, 2, 20, 0, 'a', '2020-08-18'), (2, 2, 50, 0, 'b', '2020-08-18') Go -- Consultando -- Select * From Movimentacao Go -- CTEItemPorLinha -- ;With CTEItemPorLinha (Estoque) As ( Select Distinct Estoque From Movimentacao ) -- Apresentando os Dados -- Select Distinct M.Pedido, M.Item, M.QTDE, IsNull(Lead(C.Estoque,1) Over (Partition By M.Pedido Order By M.Pedido),0) As Estoque, M.Cliente, M.DataEntrega From Movimentacao M Inner Join CTEItemPorLinha C On M.Estoque = C.Estoque Go -- Totais -- ;With CTESomaEstoquePorItem (SomaEstoque) As (Select Distinct Estoque From Movimentacao) Select 'Totais -->' As ' ', (Select SUM(QTDE) From Movimentacao) As Quantidade,
    Sum(Soma) As Estoque
    From CTESomaEstoquePorItem
    Go

    Ressalto é somente um exemplo, não garanto que possa ser esta a solução.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | 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 JukaCampos quarta-feira, 8 de julho de 2020 10:24
    sexta-feira, 3 de julho de 2020 14:51
  • Junior.

    Não sei s entendi, mas é o seguinte.

    A Estoque pode ser o mesmo para item diferente.

    Veja exemplo:


    Então não pode Select Distinc para o Estoque.

    Hoje eu tenho isso:

    E eu preciso disso:


    A diferença é apenas o estoque que não repete para o mesmo item.

    Se o próximo item é igual ao anterior o Estoque é = 0


    • Marcado como Resposta JukaCampos quarta-feira, 8 de julho de 2020 10:24
    sexta-feira, 3 de julho de 2020 16:35
  • Boa tarde,

    JukaCampos, acho que é possível conseguir esse resultado através da query, mas acho que isso deveria ser feito de preferência na camada de apresentação dos dados, que no seu caso é o relatório, e pra ser sincero não tenho nenhuma experiência com o Reporting Services, então não sei se é possível obter esse resultado com ele.

    Caso você queira implementar na query mesmo, nos informe qual versão do SQL Server você está utilizando.


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta JukaCampos quarta-feira, 8 de julho de 2020 10:24
    sexta-feira, 3 de julho de 2020 17:36
  • Junior.

    SQL Server 2008

    • Marcado como Resposta JukaCampos quarta-feira, 8 de julho de 2020 10:24
    sexta-feira, 3 de julho de 2020 18:23
  • Sendo o SQL Server 2008, segue uma sugestão utilizando a função Row_Number para poder identificar a primeira linha do item e assim retornar o valor para a coluna Estoque:

    with CTE_RN as
    (
        select
            row_number() over(partition by Item order by Pedido, DataEntrega) as RN,
            -- colunas da query atual...
    
        from -- restante da query atual...
    )
    
    select
        Pedido,
        Item,
        Qtde,
        case when RN = 1 then Estoque else 0 end as Estoque,
        Cliente.
        DataEntrega
    from CTE_RN
    

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta JukaCampos quarta-feira, 8 de julho de 2020 10:24
    sexta-feira, 3 de julho de 2020 18:47
  • Junior.

    SQL Server 2008

    Juka,

    Certo, neste caso a função Leag() não vai atender.



    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | 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 JukaCampos quarta-feira, 8 de julho de 2020 10:24
    sexta-feira, 3 de julho de 2020 21:25
  • Sendo o SQL Server 2008, segue uma sugestão utilizando a função Row_Number para poder identificar a primeira linha do item e assim retornar o valor para a coluna Estoque:

    with CTE_RN as
    (
        select
            row_number() over(partition by Item order by Pedido, DataEntrega) as RN,
            -- colunas da query atual...
    
        from -- restante da query atual...
    )
    
    select
        Pedido,
        Item,
        Qtde,
        case when RN = 1 then Estoque else 0 end as Estoque,
        Cliente.
        DataEntrega
    from CTE_RN

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    Juka,

    Acredito que este exemplo do Gapimex possa lhe ajudar.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | 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 JukaCampos quarta-feira, 8 de julho de 2020 10:25
    sexta-feira, 3 de julho de 2020 21:26
  • Olá Junior.

    Está retornando a mensagem:

    1). The multi-part identifier "DataEntrega" could not be bound.

    Essa mesma mensagem aparece para os outras colunas.

    Obrigado.

    • Marcado como Resposta JukaCampos quarta-feira, 8 de julho de 2020 10:25
    segunda-feira, 6 de julho de 2020 13:37
  • Juka, você pode postar a consulta que você tentou executar para verificarmos o que pode estar acontecendo?

    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta JukaCampos quarta-feira, 8 de julho de 2020 10:25
    segunda-feira, 6 de julho de 2020 14:04
  • Junior.

    Veja abaixo, por favor.

    with CTE_RN as
    (
        SELECT
              row_number() over(partition by T1.ItemCode order by T1.ItemCode, T1.ShipDate) as RN,
              T1.ShipDate 'Entrega',
              T0.DocDate 'Dt Pedido',
              T0.DocEntry 'Pedido',
              T0.CARDNAME 'Razão Social',
              T1.ItemCode,
              T1.Quantity 'Quantidade',
              T1.OpenCreQty 'Saldo Qtde',
              T4.OnHand 'Estoque'

       FROM ORDR T0 INNER JOIN RDR1 T1 ON T0.[DocEntry] = T1.[DocEntry]
                               INNER JOIN OITM T2 ON T1.[ItemCode] = T2.[ItemCode]
                               INNER JOIN OITB T3 ON T2.[ItmsGrpCod] = T3.[ItmsGrpCod]
                               INNER JOIN OITW T4 ON T2.ItemCode = T4.ItemCode

       WHERE
              T1.LineStatus = 'O' AND
              T1.Price > 0 AND
              T1.LineTotal > 0 AND
              T4.WhsCode = 'PA' AND
              T3.ItmsGrpNam Like 'A%%' AND
              T1.ShipDate <= [%1]

       GROUP BY
                 T1.ItemCode,
                 T1.ShipDate,
                 T1.OpenCreQty,
                 T3.ItmsGrpNam,
                 T4.OnHand,
                 T0.CARDNAME,
                 T0.DocDate,
                 T1.Dscription,
                 T0.DocEntry,
                 T1.Quantity
    )

    SELECT DISTINCT
              T1.ShipDate 'Entrega',
              T0.DocDate 'Dt Pedido',
              T0.DocEntry 'Pedido',
              T0.CARDNAME 'Razão Social',
              T1.ItemCode,
              T1.Quantity 'Quantidade',
              T1.OpenCreQty 'Saldo Qtde',
              case when RN = 1 then T4.OnHand else 0 end 'Estoque',
              T4.OnHand 'Em Estoque'

    FROM CTE_RN

    Obrigado.

    • Marcado como Resposta JukaCampos quarta-feira, 8 de julho de 2020 10:25
    segunda-feira, 6 de julho de 2020 15:43
  • Para evitar esses erros você tem que remover os aliases de dentro da CTE ou então utilizar os aliases e não o nome original das colunas na parte posterior a CTE. Na sugestão abaixo removi os aliases de dentro da CTE e mantive os nomes originais das colunas:

    with CTE_RN as
    (
        SELECT
              row_number() over(partition by T1.ItemCode order by T1.ShipDate) as RN,
              T1.ShipDate,
              T0.DocDate,
              T0.DocEntry,
              T0.CARDNAME,
              T1.ItemCode,
              T1.Quantity,
              T1.OpenCreQty,
              T4.OnHand 'Estoque'
    
       FROM ORDR T0 INNER JOIN RDR1 T1 ON T0.[DocEntry] = T1.[DocEntry]
                               INNER JOIN OITM T2 ON T1.[ItemCode] = T2.[ItemCode]
                               INNER JOIN OITB T3 ON T2.[ItmsGrpCod] = T3.[ItmsGrpCod]
                               INNER JOIN OITW T4 ON T2.ItemCode = T4.ItemCode
    
       WHERE
              T1.LineStatus = 'O' AND
              T1.Price > 0 AND
              T1.LineTotal > 0 AND
              T4.WhsCode = 'PA' AND
              T3.ItmsGrpNam Like 'A%%' AND
              T1.ShipDate <= [%1]
    
       GROUP BY
                 T1.ItemCode,
                 T1.ShipDate,
                 T1.OpenCreQty,
                 T3.ItmsGrpNam,
                 T4.OnHand,
                 T0.CARDNAME,
                 T0.DocDate,
                 T1.Dscription,
                 T0.DocEntry,
                 T1.Quantity
    )
    
    SELECT 
              T1.ShipDate 'Entrega',
              T0.DocDate 'Dt Pedido',
              T0.DocEntry 'Pedido',
              T0.CARDNAME 'Razão Social',
              T1.ItemCode,
              T1.Quantity 'Quantidade',
              T1.OpenCreQty 'Saldo Qtde',
              case when RN = 1 then T4.OnHand else 0 end 'Estoque',
              T4.OnHand 'Em Estoque'
    
    FROM CTE_RN

    Não tem relação com o problema, mas pelo que vi a coluna ItemCode não é necessária no Order By da Row_Number e desconfio que o Distinct também não. Avalie também se o Group By é necessário dentro da CTE.

    obs: não sei se você estava interagindo com o Junior ou comigo; se era comigo meu nome de usuário não é Junior

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br


    • Editado gapimex segunda-feira, 6 de julho de 2020 17:35
    • Sugerido como Resposta Junior Galvão - MVPMVP segunda-feira, 6 de julho de 2020 23:28
    • Marcado como Resposta JukaCampos quarta-feira, 8 de julho de 2020 10:25
    segunda-feira, 6 de julho de 2020 17:34
  • Desculpa, gapimex.

    Estava interagindo com o Junior.

    Obrigado pela ajuda.

    Consegui resolver colocando a linha:

      'Estoque' = case when row_number() over(partition by T1.ItemCode order by T1.ItemCode, T1.ShipDate, T0.DocDate ) = 1 then T4.OnHand else 0 end,

    direto sem criar a View.

    Mesmo assim sem a sua ajuda eu não ia conseguir.

    Veja o resultado.

    Observe que os item repete, mas o estoque não.

    Muito, mais muito obrigado mesmo.

    Deus te abençoe.

    • Marcado como Resposta JukaCampos quarta-feira, 8 de julho de 2020 10:25
    segunda-feira, 6 de julho de 2020 18:00
  • Desculpa, gapimex.

    Estava interagindo com o Junior.

    Obrigado pela ajuda.

    Consegui resolver colocando a linha:

      'Estoque' = case when row_number() over(partition by T1.ItemCode order by T1.ItemCode, T1.ShipDate, T0.DocDate ) = 1 then T4.OnHand else 0 end,

    direto sem criar a View.

    Mesmo assim sem a sua ajuda eu não ia conseguir.

    Veja o resultado.

    Observe que os item repete, mas o estoque não.

    Muito, mais muito obrigado mesmo.

    Deus te abençoe.

    Juka,

    Que bom que você conseguiu, hoje eu não tive tempo para acessar os fóruns, somente agora no final do dia.

    Com certeza a pronta ajuda do Gapimex foi fundamental para a sua necessidade.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | 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 JukaCampos quarta-feira, 8 de julho de 2020 10:26
    segunda-feira, 6 de julho de 2020 23:29
  • Junior.

    O gapimex me deu uma ajuda e deu certo.

    Muito obrigado pela sua ajuda também.

    Deus te abençoe.

    • Marcado como Resposta JukaCampos quarta-feira, 8 de julho de 2020 10:26
    terça-feira, 7 de julho de 2020 10:43
  • Junior.

    O gapimex me deu uma ajuda e deu certo.

    Muito obrigado pela sua ajuda também.

    Deus te abençoe.

    Juka,

    Não precisa agradecer, estamos aqui para colaborar e sempre aprender.



    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | 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 JukaCampos quarta-feira, 8 de julho de 2020 10:26
    terça-feira, 7 de julho de 2020 17:27