Usuário com melhor resposta
Exibir data

Pergunta
-
Boa tarde,
Através do código :
ALTER view [dbo].[RREIP_AREAS_NOC] AS with cte1 as ( SELECT [DESC_UDS],convert(float,COUNT([DESC_UDS])) as quantidade FROM BASE_RREIP WHERE AREA = 'NOC SPO/BHE' group by [DESC_UDS] ), CTE_PRODUTOS AS ( SELECT BASE_RREIP.[DESC_UDS], CONVERT(DATE,concat('01','/',DATEPART(month, dt_hr_fecom),'/',DATEPART(year, dt_hr_fecom))) as mes, (COUNT(BASE_RREIP.[DESC_UDS]) * 100) / cte1.quantidade AS PORCENTAGEM, cte1.quantidade, COUNT(BASE_RREIP.[DESC_UDS]) AS Qtde_RREIP FROM BASE_RREIP left join cte1 on BASE_RREIP.[DESC_UDS] = cte1.[DESC_UDS] WHERE RREIP = 'SIM' AND AREA = 'NOC SPO/BHE' GROUP BY BASE_RREIP.[DESC_UDS],cte1.quantidade, concat('01','/',DATEPART(month, dt_hr_fecom),'/',DATEPART(year, dt_hr_fecom)) ), cte2 as ( SELECT distinct DEPARA_UDS_NOC.[DESC_UDS], mes, PORCENTAGEM, quantidade, Qtde_RREIP FROM CTE_PRODUTOS right join DEPARA_UDS_NOC on CTE_PRODUTOS.DESC_UDS=DEPARA_UDS_NOC.DESC_UDS ) SELECT BASE_RREIP.[DESC_UDS], case when cte2.mes is null then (lead(cte2.mes) over (partition by BASE_RREIP.[DESC_UDS] order by cte2.mes)) else cte2.mes end as mes, coalesce(cte2.PORCENTAGEM,0) as PORCENTAGEM, convert(float,COUNT(BASE_RREIP.[DESC_UDS])) as quantidade, coalesce(cte2.Qtde_RREIP,0) as Qtde_RREIP FROM BASE_RREIP left join cte2 on base_rreip.DESC_UDS = cte2.DESC_UDS WHERE BASE_RREIP.AREA = 'NOC SPO/BHE' group by BASE_RREIP.[DESC_UDS],cte2.mes,cte2.PORCENTAGEM,cte2.Qtde_RREIP ;
Obtenho o seguinte resultado:
Dá forma que foi feita a estrutura das consultas anteriores, a coluna mes só será preenchida se a coluna Qtde_RREIP possuir algum valor, minha pergunta é :
No código acima eu consigo "forçar" exibir o valor da coluna mes (quando vazio), com valor do próximo registro (desde que esteja com valor)?
Ob.: não posso simplesmente escrever no registro, capturando a data do sistema, pois ao mudar o mês terei problemas.
Respostas
-
Edvaldo, pelo que vi, no resultado que você postou a coluna mes da linha seguinte tem um valor só que a coluna DESC_UDS tem um valor diferente, por isso sugeri a você que removesse o argumento "Partition by" para que a função Lead não considere essa diferença na coluna DESC_UDS.
Espero que ajude
Assinatura: http://www.imoveisemexposicao.com.br
- Marcado como Resposta Edvaldo A segunda-feira, 10 de fevereiro de 2020 18:17
Todas as Respostas
-
Edvaldo,
Inicialmente tente alterar a função Lead(), informando os parâmetros offset e default, sendo que o offset é responsável em determinar o número de linhas seguintes que o SQL Server deverá utilizar.
Veja um exemplo adaptado a sua condição:
case when cte2.mes is null then (lead(cte2.mes,2,0) Over (partition by BASE_RREIP.[DESC_UDS] order by cte2.mes)) else cte2.mes end as mes
Neste exemplo o valor 2 orienta o SQL Server a acessar os dados saltando duas linhas de registro com base na atual posição que ele se encontra.
Já o valor 0 representa o valor default que será retornado na ocorrência de um possível retorno de Null.
Não avaliei, mas as funções First_Value() e Last_Valeu() podem ser uma alternativa, dependendo o resultado que você deseja.
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]
-
-
Boa tarde,
Edvaldo, pelo que vi você já está utilizando a função Lead, mas acredito que a coluna mes ficou nula no exemplo de resultado que você postou por causa do argumento "Partition by". Experimente fazer uns testes removendo esse argumento para ver se é obtido o resultado esperado.
Espero que ajude
Assinatura: http://www.imoveisemexposicao.com.br
- Editado gapimex segunda-feira, 10 de fevereiro de 2020 17:40
- Sugerido como Resposta Junior Galvão - MVPMVP terça-feira, 11 de fevereiro de 2020 01:35
-
Boa tarde "Gapimex",
Mesmo não usando a coluna ficará nula, nas consultadas anteriores é feito um left join, a coluna mes vem justamente de uma tabela o qual não possui valor (no meu caso é porque é inicio de mês e ainda não tenho massa de dados).
Eu tentei usar o Lead, justamente para tentar contornar esse problema, quando não houver valor na coluna mes, usar o valor da próxima linha, desde que possua algum valor.
- Editado Edvaldo A segunda-feira, 10 de fevereiro de 2020 17:52 correção no texto
-
-
José,
o motivo eu já sei, tenho duas 2 tabelas (como citado, no inicio de mês não tenho massa de dados), relaciono essas duas tabelas (Numerador e denominador), como a probabilidade de não haver da dados é menor na tabela 1, eu fiz left join com a tabela 2 e retorno a coluna mes da tabela 1, mas como ainda não tenho dados na tabela 1, a coluna mes fica nula.
-
Edvaldo, pelo que vi, no resultado que você postou a coluna mes da linha seguinte tem um valor só que a coluna DESC_UDS tem um valor diferente, por isso sugeri a você que removesse o argumento "Partition by" para que a função Lead não considere essa diferença na coluna DESC_UDS.
Espero que ajude
Assinatura: http://www.imoveisemexposicao.com.br
- Marcado como Resposta Edvaldo A segunda-feira, 10 de fevereiro de 2020 18:17
-
-
Junior,
Seguindo sua sugestão, usando Lead, apresenta a seguinte mensagem de erro:
Mensagem 206, Nível 16, Estado 2, Linha 1 Conflito no tipo de operando: int é incompatível com date
Edvaldo,
É verdade, eu não havia percebido, pois você esta utilizando uma coluna do tipo Date para obter o valor do mês.
Neste caso, para não retornar este erro, o correto seria informando novamente a coluna CTE2.Mes ao invês do valor 0.
case when cte2.mes is null then (lead(cte2.mes,2,CTE2.Mes) Over (partition by BASE_RREIP.[DESC_UDS] order by cte2.mes)) else cte2.mes end as mes
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]