none
Exibir data RRS feed

  • 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.

    segunda-feira, 10 de fevereiro de 2020 16:53

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
    segunda-feira, 10 de fevereiro de 2020 18:13

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]

    segunda-feira, 10 de fevereiro de 2020 17:16
  • 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

    segunda-feira, 10 de fevereiro de 2020 17:33
  • 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
    segunda-feira, 10 de fevereiro de 2020 17:40
  • 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
    segunda-feira, 10 de fevereiro de 2020 17:51
  • Deleted
    segunda-feira, 10 de fevereiro de 2020 17:53
  • 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. 

    segunda-feira, 10 de fevereiro de 2020 18:02
  • 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
    segunda-feira, 10 de fevereiro de 2020 18:13
  • Deleted
    segunda-feira, 10 de fevereiro de 2020 18:25
  • 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]

    terça-feira, 11 de fevereiro de 2020 12:47