Usuário com melhor resposta
Não repetir o valor do campo

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
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
-
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_RNObrigado.
- Marcado como Resposta JukaCampos quarta-feira, 8 de julho de 2020 10:25
-
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
-
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
-
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
-
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
-
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
-
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
GoRessalto é 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
-
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
-
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
-
Junior.
SQL Server 2008
- Marcado como Resposta JukaCampos quarta-feira, 8 de julho de 2020 10:24
-
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
-
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
-
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
-
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
-
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
-
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
-
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
-
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
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
-
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
-
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
-
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
-
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
GoRessalto é 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
-
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
-
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
-
Junior.
SQL Server 2008
- Marcado como Resposta JukaCampos quarta-feira, 8 de julho de 2020 10:24
-
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
-
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
-
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
-
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
-
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
-
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_RNObrigado.
- Marcado como Resposta JukaCampos quarta-feira, 8 de julho de 2020 10:25
-
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
-
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
-
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
-
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
-
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