none
CTE ajuda. RRS feed

  • Pergunta

  • Boa Noite Pessoal. 

    Peço ajuda aqui mais uma vez.

    Ja tenho um CTE pronta que me trás um resultado correto. Mas preciso criar mais um relatório e essa que eu tenho me serve em 90% só preciso incluir uma nova tabela nessa consulta.  

    Pra deixar explicado. essa CTE me trás o resultado comparando o campo DataVoo quando vazio e linha fica em branco e só carrega o dia/mes e ano. 

    O que tive que fazer criar uma 2 tabela como os campos que preciso que ja existem na tbl-diariofrota. essa nova tabela nomeie como tbl_diariofrotaClone .

    o preciso fazer no 1 select dessa CET os campos que estiverem vazios preencher com os mesmos campos da tbl_diariofrotaClone.

    Alguém pode me ajudar?

    declare @dthji datetime, @dthjf datetime; set @dthji = Convert(datetime, '1/1/2015', 103); set @dthjf = Convert(datetime, '31/1/2015', 103);
    
    WITH CTE_DATA AS ( SELECT @dthji AS DATA UNION ALL SELECT DATEADD(DAY,1,DATA) FROM CTE_DATA WHERE DATA < @dthjf ) 
    SELECT   Convert(VARCHAR,DATA,103) as DATA, ISNULL(Convert(VARCHAR, TD.DataVoo, 103), '') as DataV, -- AQUI EM VEZ DE VAZIO PREENCHER COM OS DADOS DA Tbl_DiarioFrotaClone
    cast(DATEPART(YEAR, DATA) as varchar(5)) AS Ano, DATENAME(MONTH,DATA) as Mes,
    DATEPART(DAY, DATA) AS DT,
    CONVERT(VARCHAR(5),min(TD.Partida), 108) as Atv,
    CONVERT(VARCHAR(5),max(TD.Pouso),108) as Fim,
    CONVERT(VARCHAR(5),max(TD.jornIni),108) as JornIni,CONVERT(VARCHAR(5),max(TD.jornRefIni),108) as JornRefIni,
    CONVERT(VARCHAR(5),max(TD.jornRefFin),108) as JornRefFin,CONVERT(VARCHAR(5),max(TD.jornFina),108)as JornFina,
    td.Nome_Piloto,td.Tot_partida, 
        STUFF( (SELECT DISTINCT ', ' + TM.Modelo  FROM Tbl_DiarioFrota as s
                LEFT JOIN Tbl_Aeronave as TA ON TA.id_aero = s.id_aero
                LEFT join Tbl_ModeloAeronave as TM on TM.id_ModAero = TA.id_modAero
                WHERE TD.DataVoo = s.DataVoo
                FOR XML PATH(''), TYPE).value('.', 'varchar(max)')
               ,1, 2, '') as Modelo, 
          DATENAME(MONTH, td.DataVoo) as MES,cast(DATEPART(YEAR, td.DataVoo) as varchar(5)) AS ANO,
         sum(td.Total) as subt ,td.CodAncPilot
    FROM CTE_DATA A LEFT JOIN Tbl_DiarioFrota as TD ON TD.DataVoo = A.DATA and td.Nome_Piloto = 'felipe' 
    
    group by  A.DATA,TD.DataVoo,td.Nome_Piloto,td.Tot_partida,td.CodAncPilot,td.id_Piloto
    order by A.DATA
    OPTION(MAXRECURSION 0 )
    desde ja agradeço.

     

    quinta-feira, 6 de julho de 2017 22:36

Respostas

  • Qual é a sua versão do SQL Server ??

    se for Anterior ao 2012

    troca o IIF pelo CASE When

    outra coisa no trecho ( .................. Coloque os outros campos ,e pra vc finalizar seu select com os campos que vc necessita)

    segue a query corrigida

    USE PRODH;
    
    DECLARE @dthji DATETIME ,
        @dthjf DATETIME;
    SET @dthji = CONVERT(DATETIME, '1/1/2015', 103);
    SET @dthjf = CONVERT(DATETIME, '31/1/2015', 103);
    WITH    CTE_DATA
              AS ( SELECT   @dthji AS DATA
                   UNION ALL
                   SELECT   DATEADD(DAY, 1, DATA)
                   FROM     CTE_DATA
                   WHERE    DATA < @dthjf
                 ),
            SegundaCTE
              AS ( SELECT   CONVERT(VARCHAR, DATA, 103) AS DATA ,
                            ISNULL(CONVERT(VARCHAR, TD.DataVoo, 103), '') AS DataV ,
                            CAST(DATEPART(YEAR, DATA) AS VARCHAR(5)) AS Ano ,
                            DATENAME(MONTH, DATA) AS Mes ,
                            DATEPART(DAY, DATA) AS DT ,
                            CONVERT(VARCHAR(5), MIN(TD.Partida), 108) AS Atv ,
                            CONVERT(VARCHAR(5), MAX(TD.Pouso), 108) AS Fim ,
                            CONVERT(VARCHAR(5), MAX(TD.jornIni), 108) AS JornIni ,
                            CONVERT(VARCHAR(5), MAX(TD.jornRefIni), 108) AS JornRefIni ,
                            CONVERT(VARCHAR(5), MAX(TD.jornRefFin), 108) AS JornRefFin ,
                            CONVERT(VARCHAR(5), MAX(TD.jornFina), 108) AS JornFina ,
                            TD.IdPiloto ,
                            TD.Nome_Piloto ,
                            TD.Tot_partida ,
                            STUFF( (SELECT DISTINCT
                                            ', ' + TM.Modelo
                                    FROM    Tbl_DiarioFrota AS s
                                            LEFT JOIN Tbl_Aeronave AS TA ON TA.id_aero = s.id_aero
                                            LEFT JOIN Tbl_ModeloAeronave AS TM ON TM.id_ModAero = TA.id_modAero
                                    WHERE   TD.DataVoo = s.DataVoo
                            FOR   XML PATH('') ,
                                      TYPE).value('.', 'varchar(max)'), 1, 2, '') AS Modelo ,
                            DATENAME(MONTH, TD.DataVoo) AS MES ,
                            CAST(DATEPART(YEAR, TD.DataVoo) AS VARCHAR(5)) AS ANO ,
                            SUM(TD.Total) AS subt ,
                            TD.CodAncPilot
                   FROM     CTE_DATA A
                            LEFT JOIN Tbl_DiarioFrota AS TD ON TD.DataVoo = A.DATA
                                                               AND TD.Nome_Piloto = 'felipe'
                   GROUP BY A.DATA ,
                            TD.DataVoo ,
                            TD.IdPiloto ,
                            TD.Nome_Piloto ,
                            TD.Tot_partida ,
                            TD.CodAncPilot ,
                            TD.id_Piloto
                 )
        SELECT  R.DATA ,
                DataV = IIF(LEN(LTRIM(RTRIM(R.DataV))) > 0, R.DataV, LeftT.DataVoo) , --Nos Campos que são vazios devem ser assim
                Ano = ISNULL(R.Ano, LeftT.Ano) , --Nos Campos que são nulos devem ser assim
                Mes = ISNULL(R.Mes, LeftT.Mes) ,
                DT = ISNULL(R.DT, LeftT.DT) ,
                Atv = ISNULL(R.Atv, LeftT.Atv) ,
                Fim = ISNULL(R.Fim, LeftT.Fim) ,
                JornIni = ISNULL(R.JornIni, LeftT.JornIni) ,
                JornRefIni = ISNULL(R.JornRefIni, LeftT.JornRefIni) ,
                JornRefFin = ISNULL(R.JornRefFin, LeftT.JornRefFin) ,
                JornFina = ISNULL(R.JornFina, LeftT.JornFina) ,
                IdPiloto = ISNULL(R.IdPiloto, LeftT.IdPiloto) ,
                Nome_Piloto = ISNULL(R.Nome_Piloto, LeftT.Nome_Piloto) ,
                Tot_partida = ISNULL(R.Tot_partida, LeftT.Tot_partida) ,
                Modelo = ISNULL(R.Modelo, LeftT.Modelo) ,
                MESVoo = ISNULL(R.MESVoo, LeftT.MESVoo) ,
                ANOVoo = ISNULL(R.ANOVoo, LeftT.ANOVoo) ,
                subt = ISNULL(R.subt, LeftT.subt) ,
                CodAncPilot = ISNULL(R.CodAncPilot, LeftT.CodAncPilot)
        FROM    SegundaCTE AS R
                LEFT JOIN Tbl_DiarioFrotaClone LeftT ON R.IdPiloto = LeftT.IdPiloto
                                                        AND R.DATA = CONVERT(VARCHAR, LeftT.DataVoo, 103) --Acertar qual e o Criterio do Left
        ORDER BY R.DATA
    OPTION  ( MAXRECURSION 0 );


    Wesley Neves - Brasilia-DF

     
    wesley.si.neves@gmail.com
    MTA-SQL Server
    MTA- Web Development
    Analista Desenvolvedor.NET
    Pós-Graduando em Banco de Dados 
    "Se a resposta for útil ou ajudar ,não esqueça de marcar"




    Wesley Neves

    • Marcado como Resposta Wsti quinta-feira, 13 de julho de 2017 14:19
    sexta-feira, 7 de julho de 2017 16:43

Todas as Respostas

  • Se entedi dereito ,basta criar uma nova CTE com resultado da sua query a  apartir desta vc verificar se o campo está vazio 

    algo mais ou menos assim 

    DECLARE @dthji DATETIME ,
        @dthjf DATETIME;
    SET @dthji = CONVERT(DATETIME, '1/1/2015', 103);
    SET @dthjf = CONVERT(DATETIME, '31/1/2015', 103);
    
    WITH    CTE_DATA
              AS ( SELECT   @dthji AS DATA
                   UNION ALL
                   SELECT   DATEADD(DAY, 1, DATA)
                   FROM     CTE_DATA
                   WHERE    DATA < @dthjf
                 ),
    	 SegundaCTE AS (
    			 
    			 SELECT  CONVERT(VARCHAR, DATA, 103) AS DATA ,
                ISNULL(CONVERT(VARCHAR, TD.DataVoo, 103), '') AS DataV , -- AQUI EM VEZ DE VAZIO PREENCHER COM OS DADOS DA Tbl_DiarioFrotaClone
                CAST(DATEPART(YEAR, DATA) AS VARCHAR(5)) AS Ano ,
                DATENAME(MONTH, DATA) AS Mes ,
                DATEPART(DAY, DATA) AS DT ,
                CONVERT(VARCHAR(5), MIN(TD.Partida), 108) AS Atv ,
                CONVERT(VARCHAR(5), MAX(TD.Pouso), 108) AS Fim ,
                CONVERT(VARCHAR(5), MAX(TD.jornIni), 108) AS JornIni ,
                CONVERT(VARCHAR(5), MAX(TD.jornRefIni), 108) AS JornRefIni ,
                CONVERT(VARCHAR(5), MAX(TD.jornRefFin), 108) AS JornRefFin ,
                CONVERT(VARCHAR(5), MAX(TD.jornFina), 108) AS JornFina ,
                TD.Nome_Piloto ,
                TD.Tot_partida ,
                STUFF( (SELECT DISTINCT
                                ', ' + TM.Modelo
                        FROM    Tbl_DiarioFrota AS s
                                LEFT JOIN Tbl_Aeronave AS TA ON TA.id_aero = s.id_aero
                                LEFT JOIN Tbl_ModeloAeronave AS TM ON TM.id_ModAero = TA.id_modAero
                        WHERE   TD.DataVoo = s.DataVoo
                FOR   XML PATH('') ,
                          TYPE).value('.', 'varchar(max)'), 1, 2, '') AS Modelo ,
                DATENAME(MONTH, TD.DataVoo) AS MES ,
                CAST(DATEPART(YEAR, TD.DataVoo) AS VARCHAR(5)) AS ANO ,
                SUM(TD.Total) AS subt ,
                TD.CodAncPilot
        FROM    CTE_DATA A
                LEFT JOIN Tbl_DiarioFrota AS TD ON TD.DataVoo = A.DATA
                                                   AND TD.Nome_Piloto = 'felipe'
        GROUP BY A.DATA ,
                TD.DataVoo ,
                TD.Nome_Piloto ,
                TD.Tot_partida ,
                TD.CodAncPilot ,
                TD.id_Piloto
    
    			 )
     
        SELECT   R.DATA ,
                 R.DataV , -- AQUI EM VEZ DE VAZIO PREENCHER COM OS DADOS DA Tbl_DiarioFrotaClone
    			 teste = CASE WHEN  LEN(LTRIM(RTRIM(R.DataV))) > 0 THEN r.DataV ELSE
    					(SELECT TOP 1 T.Data FROM Tbl_DiarioFrotaClone T WHERE (Seu Predicado)  ) END,
    
                 R.Ano ,
                 R.Mes ,
                 R.DT ,
                 R.Atv ,
                 R.Fim ,
                 R.JornIni ,
                 R.JornRefIni ,
                 R.JornRefFin ,
                 R.JornFina ,
                 R.Nome_Piloto ,
                 R.Tot_partida ,
                 R.Modelo ,
                 R.MESVoo ,
                 R.ANOVoo ,
                 R.subt ,
                 R.CodAncPilot
        FROM    SegundaCTE R
        ORDER BY R.DATA
    OPTION  ( MAXRECURSION 0 );

    Wesley Neves - Brasilia-DF

     
    wesley.si.neves@gmail.com
    MTA-SQL Server
    MTA- Web Development
    Analista Desenvolvedor.NET
    Pós-Graduando em Banco de Dados 
    "Se a resposta for útil ou ajudar ,não esqueça de marcar"


    • Editado Wesley Neves sexta-feira, 7 de julho de 2017 11:32 complemento
    sexta-feira, 7 de julho de 2017 11:31
  • Bom Dia Wesley.

    Amigo gerou alguns erros. e me desculpa a ignorância, que não entendi.

    use PRODH
    
    DECLARE @dthji DATETIME , @dthjf DATETIME; SET @dthji = CONVERT(DATETIME, '1/1/2015', 103); SET @dthjf = CONVERT(DATETIME, '31/1/2015', 103);
    WITH CTE_DATA AS(SELECT @dthji AS DATA UNION ALL SELECT DATEADD(DAY, 1,DATA) FROM CTE_DATA  WHERE DATA < @dthjf),
    SegundaCTE AS (			 
     SELECT  CONVERT(VARCHAR, DATA, 103) AS DATA , ISNULL(CONVERT(VARCHAR, TD.DataVoo, 103), '') AS DataV, 
     CAST(DATEPART(YEAR, DATA) AS VARCHAR(5)) AS Ano ,
     DATENAME(MONTH, DATA) AS Mes ,
     DATEPART(DAY, DATA) AS DT ,
     CONVERT(VARCHAR(5), MIN(TD.Partida), 108) AS Atv ,  CONVERT(VARCHAR(5), MAX(TD.Pouso), 108) AS Fim ,
     CONVERT(VARCHAR(5), MAX(TD.jornIni), 108) AS JornIni , CONVERT(VARCHAR(5), MAX(TD.jornRefIni), 108) AS JornRefIni ,
     CONVERT(VARCHAR(5), MAX(TD.jornRefFin), 108) AS JornRefFin , CONVERT(VARCHAR(5), MAX(TD.jornFina), 108) AS JornFina ,
     TD.Nome_Piloto ,TD.Tot_partida ,
     STUFF( (SELECT DISTINCT ', ' + TM.Modelo
     FROM    Tbl_DiarioFrota AS s  LEFT JOIN Tbl_Aeronave AS TA ON TA.id_aero = s.id_aero
     LEFT JOIN Tbl_ModeloAeronave AS TM ON TM.id_ModAero = TA.id_modAero
     WHERE   TD.DataVoo = s.DataVoo FOR   XML PATH('') , TYPE).value('.', 'varchar(max)'), 1, 2, '') AS Modelo ,
     DATENAME(MONTH,TD.DataVoo) AS MES ,CAST(DATEPART(YEAR,TD.DataVoo) AS VARCHAR(5)) AS ANO,SUM(TD.Total) AS subt,TD.CodAncPilot
        FROM  CTE_DATA A LEFT JOIN Tbl_DiarioFrota AS TD ON TD.DataVoo = A.DATA AND TD.Nome_Piloto = 'felipe'
        GROUP BY A.DATA,TD.DataVoo,TD.Nome_Piloto,TD.Tot_partida,TD.CodAncPilot,TD.id_Piloto )
     
        SELECT   R.DATA ,R.DataV , teste = CASE WHEN  LEN(LTRIM(RTRIM(R.DataV))) > 0 THEN R.DataV ELSE
    	(SELECT TOP 1 TD.Data FROM Tbl_DiarioFrotaClone T WHERE (Seu Predicado)  ) END 
    R.Ano,R.Mes,R.DT,R.Atv,R.Fim,R.JornIni,R.JornRefIni,R.JornRefFin,R.JornFina,R.Nome_Piloto,R.Tot_partida,R.Modelo,R.MESVoo,
    R.ANOVoo,R.subt,R.CodAncPilot
     FROM    SegundaCTE as R ORDER BY R.DATA OPTION ( MAXRECURSION 0 );
    Mensagem 102, Nível 15, Estado 1, Linha 23
    Sintaxe incorreta próxima a 'Predicado'.
    Mensagem 102, Nível 15, Estado 1, Linha 24
    Sintaxe incorreta próxima a 'R'.
     
    • Sugerido como Resposta Wesley Neves sexta-feira, 7 de julho de 2017 12:15
    • Não Sugerido como Resposta Wesley Neves sexta-feira, 7 de julho de 2017 12:15
    sexta-feira, 7 de julho de 2017 12:00
  • o preciso fazer no 1 select dessa CET os campos que estiverem vazios preencher com os mesmos campos da tbl_diariofrotaClone.

    para cada campo vazio  do seu resultado que vc  precisa informar o correspondente na tabela tbl_diariofrotaClone.

    mas vc não postou  quais campos da tabela tbl_diariofrotaClone e correspondente a sua CTE

    por esse motivo vc precisa infomar na clausula 

    WHERE (Seu Predicado)

    como a consulta da CTE se relaciona com a tabela tbl_diariofrotaClone

    por isso que da erro 

    Mensagem 102, Nível 15, Estado 1, Linha 23
    Sintaxe incorreta próxima a 'Predicado'.
    Mensagem 102, Nível 15, Estado 1, Linha 24
    Sintaxe incorreta próxima a 'R'.

    seque a correção 

    USE PRODH;
    
    DECLARE @dthji DATETIME ,
        @dthjf DATETIME;
    SET @dthji = CONVERT(DATETIME, '1/1/2015', 103);
    SET @dthjf = CONVERT(DATETIME, '31/1/2015', 103);
    WITH    CTE_DATA
              AS ( SELECT   @dthji AS DATA
                   UNION ALL
                   SELECT   DATEADD(DAY, 1, DATA)
                   FROM     CTE_DATA
                   WHERE    DATA < @dthjf
                 ),
            SegundaCTE
              AS ( SELECT   CONVERT(VARCHAR, DATA, 103) AS DATA ,
                            ISNULL(CONVERT(VARCHAR, TD.DataVoo, 103), '') AS DataV ,
                            CAST(DATEPART(YEAR, DATA) AS VARCHAR(5)) AS Ano ,
                            DATENAME(MONTH, DATA) AS Mes ,
                            DATEPART(DAY, DATA) AS DT ,
                            CONVERT(VARCHAR(5), MIN(TD.Partida), 108) AS Atv ,
                            CONVERT(VARCHAR(5), MAX(TD.Pouso), 108) AS Fim ,
                            CONVERT(VARCHAR(5), MAX(TD.jornIni), 108) AS JornIni ,
                            CONVERT(VARCHAR(5), MAX(TD.jornRefIni), 108) AS JornRefIni ,
                            CONVERT(VARCHAR(5), MAX(TD.jornRefFin), 108) AS JornRefFin ,
                            CONVERT(VARCHAR(5), MAX(TD.jornFina), 108) AS JornFina ,
                            TD.Nome_Piloto ,
                            TD.Tot_partida ,
                            STUFF( (SELECT DISTINCT
                                            ', ' + TM.Modelo
                                    FROM    Tbl_DiarioFrota AS s
                                            LEFT JOIN Tbl_Aeronave AS TA ON TA.id_aero = s.id_aero
                                            LEFT JOIN Tbl_ModeloAeronave AS TM ON TM.id_ModAero = TA.id_modAero
                                    WHERE   TD.DataVoo = s.DataVoo
                            FOR   XML PATH('') ,
                                      TYPE).value('.', 'varchar(max)'), 1, 2, '') AS Modelo ,
                            DATENAME(MONTH, TD.DataVoo) AS MES ,
                            CAST(DATEPART(YEAR, TD.DataVoo) AS VARCHAR(5)) AS ANO ,
                            SUM(TD.Total) AS subt ,
                            TD.CodAncPilot
                   FROM     CTE_DATA A
                            LEFT JOIN Tbl_DiarioFrota AS TD ON TD.DataVoo = A.DATA
                                                               AND TD.Nome_Piloto = 'felipe'
                   GROUP BY A.DATA ,
                            TD.DataVoo ,
                            TD.Nome_Piloto ,
                            TD.Tot_partida ,
                            TD.CodAncPilot ,
                            TD.id_Piloto
                 )
        SELECT  R.DATA ,
                R.DataV ,
                teste = CASE WHEN LEN(LTRIM(RTRIM(R.DataV))) > 0 THEN R.DataV
                             ELSE ( SELECT TOP 1
                                            TD.Data
                                    FROM    Tbl_DiarioFrotaClone T
    	-- WHERE (Colocar aqui os campos chaves de relacionamento entre  Tbl_DiarioFrotaClone e sua CTE)
                                  )
                        END ,
                R.Ano ,
                R.Mes ,
                R.DT ,
                R.Atv ,
                R.Fim ,
                R.JornIni ,
                R.JornRefIni ,
                R.JornRefFin ,
                R.JornFina ,
                R.Nome_Piloto ,
                R.Tot_partida ,
                R.Modelo ,
                R.MESVoo ,
                R.ANOVoo ,
                R.subt ,
                R.CodAncPilot
        FROM    SegundaCTE AS R
        ORDER BY R.DATA
    OPTION  ( MAXRECURSION 0 );


    Wesley Neves



    Wesley Neves - Brasilia-DF

     
    wesley.si.neves@gmail.com
    MTA-SQL Server
    MTA- Web Development
    Analista Desenvolvedor.NET
    Pós-Graduando em Banco de Dados 
    "Se a resposta for útil ou ajudar ,não esqueça de marcar"



    • Editado Wesley Neves sexta-feira, 7 de julho de 2017 12:21 Correçaõ
    sexta-feira, 7 de julho de 2017 12:20
  • Oi wesley, 

    então os campos que preciso são esses aqui: 

    NomePiloto, JornIni, JornRefIni,JornRefFin ,JornFina , tipo ( este campo não existe na tbl_DiarioFrota) mas preciso que ele seja carregado quando a linha esteja vazia. 

    segue imagem de como ficou

    coloquei somente o nome, e o retorno foi vazio. 

    obrigado pela paciência.

    sexta-feira, 7 de julho de 2017 13:25
  • Posta novamente a imagem ,pois não da para aumentar 


    Wesley Neves

    sexta-feira, 7 de julho de 2017 13:33
  • sexta-feira, 7 de julho de 2017 13:41
  • pelo que pude perceber na tabela Tbl_DiarioFrotaClone não existe registro para o piloto felipe

    ou seja dia 01/01/2015 acredito que ele não vez vôo.

    1)  faça um select na tabela Tbl_DiarioFrotaClone  para o piloto felipe 

    2) se prefereir mostra como seria a saida que vc precisa 



    Wesley Neves - Brasilia-DF

     
    wesley.si.neves@gmail.com
    MTA-SQL Server
    MTA- Web Development
    Analista Desenvolvedor.NET
    Pós-Graduando em Banco de Dados 
    "Se a resposta for útil ou ajudar ,não esqueça de marcar"




    Wesley Neves

    sexta-feira, 7 de julho de 2017 14:00
  • 
    sexta-feira, 7 de julho de 2017 14:04
  • tem sim 

    criei dois registros justamente nos dias q estao em branco.

    sexta-feira, 7 de julho de 2017 14:05
  • vi alguns pontos que pode ser melhorados

    USE PRODH;
    
    DECLARE @dthji DATETIME ,
        @dthjf DATETIME;
    SET @dthji = CONVERT(DATETIME, '1/1/2015', 103);
    SET @dthjf = CONVERT(DATETIME, '31/1/2015', 103);
    WITH    CTE_DATA
              AS ( SELECT   @dthji AS DATA
                   UNION ALL
                   SELECT   DATEADD(DAY, 1, DATA)
                   FROM     CTE_DATA
                   WHERE    DATA < @dthjf
                 ),
            SegundaCTE
              AS ( SELECT   CONVERT(VARCHAR, DATA, 103) AS DATA ,
                            ISNULL(CONVERT(VARCHAR, TD.DataVoo, 103), '') AS DataV ,
                            CAST(DATEPART(YEAR, DATA) AS VARCHAR(5)) AS Ano ,
                            DATENAME(MONTH, DATA) AS Mes ,
                            DATEPART(DAY, DATA) AS DT ,
                            CONVERT(VARCHAR(5), MIN(TD.Partida), 108) AS Atv ,
                            CONVERT(VARCHAR(5), MAX(TD.Pouso), 108) AS Fim ,
                            CONVERT(VARCHAR(5), MAX(TD.jornIni), 108) AS JornIni ,
                            CONVERT(VARCHAR(5), MAX(TD.jornRefIni), 108) AS JornRefIni ,
                            CONVERT(VARCHAR(5), MAX(TD.jornRefFin), 108) AS JornRefFin ,
                            CONVERT(VARCHAR(5), MAX(TD.jornFina), 108) AS JornFina ,
    			TD.IdPiloto,
                            TD.Nome_Piloto ,
                            TD.Tot_partida ,
                            STUFF( (SELECT DISTINCT
                                            ', ' + TM.Modelo
                                    FROM    Tbl_DiarioFrota AS s
                                            LEFT JOIN Tbl_Aeronave AS TA ON TA.id_aero = s.id_aero
                                            LEFT JOIN Tbl_ModeloAeronave AS TM ON TM.id_ModAero = TA.id_modAero
                                    WHERE   TD.DataVoo = s.DataVoo
                            FOR   XML PATH('') ,
                                      TYPE).value('.', 'varchar(max)'), 1, 2, '') AS Modelo ,
                            DATENAME(MONTH, TD.DataVoo) AS MES ,
                            CAST(DATEPART(YEAR, TD.DataVoo) AS VARCHAR(5)) AS ANO ,
                            SUM(TD.Total) AS subt ,
                            TD.CodAncPilot
                   FROM     CTE_DATA A
                            LEFT JOIN Tbl_DiarioFrota AS TD ON TD.DataVoo = A.DATA
                                                               AND TD.Nome_Piloto = 'felipe'
                   GROUP BY A.DATA ,
                            TD.DataVoo ,
    			TD.IdPiloto,
                            TD.Nome_Piloto ,
                            TD.Tot_partida ,
                            TD.CodAncPilot ,
                            TD.id_Piloto
                 )
        SELECT  R.DATA ,
                R.DataV ,
                teste = CASE WHEN LEN(LTRIM(RTRIM(R.DataV))) > 0 THEN R.DataV
                             ELSE ( SELECT TOP 1
                                            T.DataVoo
                                    FROM    Tbl_DiarioFrotaClone T WHERE T.IdPiloto = R.IdPiloto
    									AND T.DataVoo = R.DATA
    	-- WHERE (Colocar aqui os campos chaves de relacionamento entre  Tbl_DiarioFrotaClone e sua CTE)
                                  )
                        END ,
                R.Ano ,
                R.Mes ,
                R.DT ,
                R.Atv ,
                R.Fim ,
                R.JornIni ,
                R.JornRefIni ,
                R.JornRefFin ,
                R.JornFina ,
    			R.IdPiloto,
                R.Nome_Piloto ,
                R.Tot_partida ,
                R.Modelo ,
                R.MESVoo ,
                R.ANOVoo ,
                R.subt ,
                R.CodAncPilot
        FROM    SegundaCTE AS R
        ORDER BY R.DATA
    OPTION  ( MAXRECURSION 0 );
    
    

    veja se funcionou 


    Wesley Neves - Brasilia-DF

     
    wesley.si.neves@gmail.com
    MTA-SQL Server
    MTA- Web Development
    Analista Desenvolvedor.NET
    Pós-Graduando em Banco de Dados 
    "Se a resposta for útil ou ajudar ,não esqueça de marcar"




    Wesley Neves

    sexta-feira, 7 de julho de 2017 14:29
  • wesley. o resultado foi o mesmo. preencho o where que esta comentado ? 
    sexta-feira, 7 de julho de 2017 14:45
  • Acredito que o que esteja faltando e o convert  

    USE PRODH;
    
    DECLARE @dthji DATETIME ,
        @dthjf DATETIME;
    SET @dthji = CONVERT(DATETIME, '1/1/2015', 103);
    SET @dthjf = CONVERT(DATETIME, '31/1/2015', 103);
    WITH    CTE_DATA
              AS ( SELECT   @dthji AS DATA
                   UNION ALL
                   SELECT   DATEADD(DAY, 1, DATA)
                   FROM     CTE_DATA
                   WHERE    DATA < @dthjf
                 ),
            SegundaCTE
              AS ( SELECT   CONVERT(VARCHAR, DATA, 103) AS DATA ,
                            ISNULL(CONVERT(VARCHAR, TD.DataVoo, 103), '') AS DataV ,
                            CAST(DATEPART(YEAR, DATA) AS VARCHAR(5)) AS Ano ,
                            DATENAME(MONTH, DATA) AS Mes ,
                            DATEPART(DAY, DATA) AS DT ,
                            CONVERT(VARCHAR(5), MIN(TD.Partida), 108) AS Atv ,
                            CONVERT(VARCHAR(5), MAX(TD.Pouso), 108) AS Fim ,
                            CONVERT(VARCHAR(5), MAX(TD.jornIni), 108) AS JornIni ,
                            CONVERT(VARCHAR(5), MAX(TD.jornRefIni), 108) AS JornRefIni ,
                            CONVERT(VARCHAR(5), MAX(TD.jornRefFin), 108) AS JornRefFin ,
                            CONVERT(VARCHAR(5), MAX(TD.jornFina), 108) AS JornFina ,
    			TD.IdPiloto,
                            TD.Nome_Piloto ,
                            TD.Tot_partida ,
                            STUFF( (SELECT DISTINCT
                                            ', ' + TM.Modelo
                                    FROM    Tbl_DiarioFrota AS s
                                            LEFT JOIN Tbl_Aeronave AS TA ON TA.id_aero = s.id_aero
                                            LEFT JOIN Tbl_ModeloAeronave AS TM ON TM.id_ModAero = TA.id_modAero
                                    WHERE   TD.DataVoo = s.DataVoo
                            FOR   XML PATH('') ,
                                      TYPE).value('.', 'varchar(max)'), 1, 2, '') AS Modelo ,
                            DATENAME(MONTH, TD.DataVoo) AS MES ,
                            CAST(DATEPART(YEAR, TD.DataVoo) AS VARCHAR(5)) AS ANO ,
                            SUM(TD.Total) AS subt ,
                            TD.CodAncPilot
                   FROM     CTE_DATA A
                            LEFT JOIN Tbl_DiarioFrota AS TD ON TD.DataVoo = A.DATA
                                                               AND TD.Nome_Piloto = 'felipe'
                   GROUP BY A.DATA ,
                            TD.DataVoo ,
    			TD.IdPiloto,
                            TD.Nome_Piloto ,
                            TD.Tot_partida ,
                            TD.CodAncPilot ,
                            TD.id_Piloto
                 )
        SELECT  R.DATA ,
                R.DataV ,
                teste = CASE WHEN LEN(LTRIM(RTRIM(R.DataV))) > 0 THEN R.DataV
                             ELSE ( SELECT TOP 1
                                            T.DataVoo
                                    FROM    Tbl_DiarioFrotaClone T WHERE T.IdPiloto = R.IdPiloto
    									--AND T.DataVoo = R.DATA
    									AND  R.DATA = CONVERT(VARCHAR, T.DataVoo, 103)
    	-- WHERE (Colocar aqui os campos chaves de relacionamento entre  Tbl_DiarioFrotaClone e sua CTE)
                                  )
                        END ,
                R.Ano ,
                R.Mes ,
                R.DT ,
                R.Atv ,
                R.Fim ,
                R.JornIni ,
                R.JornRefIni ,
                R.JornRefFin ,
                R.JornFina ,
    			R.IdPiloto,
                R.Nome_Piloto ,
                R.Tot_partida ,
                R.Modelo ,
                R.MESVoo ,
                R.ANOVoo ,
                R.subt ,
                R.CodAncPilot
        FROM    SegundaCTE AS R
        ORDER BY R.DATA
    OPTION  ( MAXRECURSION 0 );


    Wesley Neves - Brasilia-DF

     
    wesley.si.neves@gmail.com
    MTA-SQL Server
    MTA- Web Development
    Analista Desenvolvedor.NET
    Pós-Graduando em Banco de Dados 
    "Se a resposta for útil ou ajudar ,não esqueça de marcar"




    Wesley Neves

    sexta-feira, 7 de julho de 2017 14:57
  • Wesley, da forma a cima o que mudou é que a coluna teste recebeu a data do campo DATA, mas os outros campos continuam NULL
    sexta-feira, 7 de julho de 2017 15:14
  • Da Ultima query que te passei posta o resultado por favor.


    Wesley Neves

    Agora Entendi que vc trocar todos os campos nullos do seu Select :) 

    acredito que vc possa fazer  via LEFT JOIN

    seque um modelo 

    USE PRODH;
    
    DECLARE @dthji DATETIME ,
        @dthjf DATETIME;
    SET @dthji = CONVERT(DATETIME, '1/1/2015', 103);
    SET @dthjf = CONVERT(DATETIME, '31/1/2015', 103);
    WITH    CTE_DATA
              AS ( SELECT   @dthji AS DATA
                   UNION ALL
                   SELECT   DATEADD(DAY, 1, DATA)
                   FROM     CTE_DATA
                   WHERE    DATA < @dthjf
                 ),
            SegundaCTE
              AS ( SELECT   CONVERT(VARCHAR, DATA, 103) AS DATA ,
                            ISNULL(CONVERT(VARCHAR, TD.DataVoo, 103), '') AS DataV ,
                            CAST(DATEPART(YEAR, DATA) AS VARCHAR(5)) AS Ano ,
                            DATENAME(MONTH, DATA) AS Mes ,
                            DATEPART(DAY, DATA) AS DT ,
                            CONVERT(VARCHAR(5), MIN(TD.Partida), 108) AS Atv ,
                            CONVERT(VARCHAR(5), MAX(TD.Pouso), 108) AS Fim ,
                            CONVERT(VARCHAR(5), MAX(TD.jornIni), 108) AS JornIni ,
                            CONVERT(VARCHAR(5), MAX(TD.jornRefIni), 108) AS JornRefIni ,
                            CONVERT(VARCHAR(5), MAX(TD.jornRefFin), 108) AS JornRefFin ,
                            CONVERT(VARCHAR(5), MAX(TD.jornFina), 108) AS JornFina ,
    			TD.IdPiloto,
                            TD.Nome_Piloto ,
                            TD.Tot_partida ,
                            STUFF( (SELECT DISTINCT
                                            ', ' + TM.Modelo
                                    FROM    Tbl_DiarioFrota AS s
                                            LEFT JOIN Tbl_Aeronave AS TA ON TA.id_aero = s.id_aero
                                            LEFT JOIN Tbl_ModeloAeronave AS TM ON TM.id_ModAero = TA.id_modAero
                                    WHERE   TD.DataVoo = s.DataVoo
                            FOR   XML PATH('') ,
                                      TYPE).value('.', 'varchar(max)'), 1, 2, '') AS Modelo ,
                            DATENAME(MONTH, TD.DataVoo) AS MES ,
                            CAST(DATEPART(YEAR, TD.DataVoo) AS VARCHAR(5)) AS ANO ,
                            SUM(TD.Total) AS subt ,
                            TD.CodAncPilot
                   FROM     CTE_DATA A
                            LEFT JOIN Tbl_DiarioFrota AS TD ON TD.DataVoo = A.DATA
                                                               AND TD.Nome_Piloto = 'felipe'
                   GROUP BY A.DATA ,
                            TD.DataVoo ,
    			TD.IdPiloto,
                            TD.Nome_Piloto ,
                            TD.Tot_partida ,
                            TD.CodAncPilot ,
                            TD.id_Piloto
                 )
        SELECT  R.DATA ,
                DataV  = IIF(LEN(LTRIM(RTRIM(R.DataV))) > 0,R.DataV,LeftT.DataVoo) , --Nos Campos que são vazios devem ser assim
                Ano  = ISNULL(R.Ano,LeftT.Ano), --Nos Campos que são nulos devem ser assim
                Mes  =ISNULL(R.Mes,LeftT.Mes),
                R.DT ,
                R.Atv =ISNULL(R.Atv,LeftT.Atv),
    			....... --Coloque os outros campos 
        FROM    SegundaCTE AS R
    	LEFT JOIN Tbl_DiarioFrotaClone LeftT ON  R.IdPiloto = LeftT.IdPiloto AND R.DATA = CONVERT(VARCHAR, LeftT.DataVoo, 103) --Acertar qual e o Criterio do Left
        ORDER BY R.DATA
    OPTION  ( MAXRECURSION 0 );


    Wesley Neves - Brasilia-DF

     
    wesley.si.neves@gmail.com
    MTA-SQL Server
    MTA- Web Development
    Analista Desenvolvedor.NET
    Pós-Graduando em Banco de Dados 
    "Se a resposta for útil ou ajudar ,não esqueça de marcar"



    • Editado Wesley Neves sexta-feira, 7 de julho de 2017 15:43 complemento
    sexta-feira, 7 de julho de 2017 15:37
  • sexta-feira, 7 de julho de 2017 15:44
  • wesley. nao esta reconhecendo  os grifados abaixo. 
    sexta-feira, 7 de julho de 2017 16:20
  • Qual é a sua versão do SQL Server ??

    se for Anterior ao 2012

    troca o IIF pelo CASE When

    outra coisa no trecho ( .................. Coloque os outros campos ,e pra vc finalizar seu select com os campos que vc necessita)

    segue a query corrigida

    USE PRODH;
    
    DECLARE @dthji DATETIME ,
        @dthjf DATETIME;
    SET @dthji = CONVERT(DATETIME, '1/1/2015', 103);
    SET @dthjf = CONVERT(DATETIME, '31/1/2015', 103);
    WITH    CTE_DATA
              AS ( SELECT   @dthji AS DATA
                   UNION ALL
                   SELECT   DATEADD(DAY, 1, DATA)
                   FROM     CTE_DATA
                   WHERE    DATA < @dthjf
                 ),
            SegundaCTE
              AS ( SELECT   CONVERT(VARCHAR, DATA, 103) AS DATA ,
                            ISNULL(CONVERT(VARCHAR, TD.DataVoo, 103), '') AS DataV ,
                            CAST(DATEPART(YEAR, DATA) AS VARCHAR(5)) AS Ano ,
                            DATENAME(MONTH, DATA) AS Mes ,
                            DATEPART(DAY, DATA) AS DT ,
                            CONVERT(VARCHAR(5), MIN(TD.Partida), 108) AS Atv ,
                            CONVERT(VARCHAR(5), MAX(TD.Pouso), 108) AS Fim ,
                            CONVERT(VARCHAR(5), MAX(TD.jornIni), 108) AS JornIni ,
                            CONVERT(VARCHAR(5), MAX(TD.jornRefIni), 108) AS JornRefIni ,
                            CONVERT(VARCHAR(5), MAX(TD.jornRefFin), 108) AS JornRefFin ,
                            CONVERT(VARCHAR(5), MAX(TD.jornFina), 108) AS JornFina ,
                            TD.IdPiloto ,
                            TD.Nome_Piloto ,
                            TD.Tot_partida ,
                            STUFF( (SELECT DISTINCT
                                            ', ' + TM.Modelo
                                    FROM    Tbl_DiarioFrota AS s
                                            LEFT JOIN Tbl_Aeronave AS TA ON TA.id_aero = s.id_aero
                                            LEFT JOIN Tbl_ModeloAeronave AS TM ON TM.id_ModAero = TA.id_modAero
                                    WHERE   TD.DataVoo = s.DataVoo
                            FOR   XML PATH('') ,
                                      TYPE).value('.', 'varchar(max)'), 1, 2, '') AS Modelo ,
                            DATENAME(MONTH, TD.DataVoo) AS MES ,
                            CAST(DATEPART(YEAR, TD.DataVoo) AS VARCHAR(5)) AS ANO ,
                            SUM(TD.Total) AS subt ,
                            TD.CodAncPilot
                   FROM     CTE_DATA A
                            LEFT JOIN Tbl_DiarioFrota AS TD ON TD.DataVoo = A.DATA
                                                               AND TD.Nome_Piloto = 'felipe'
                   GROUP BY A.DATA ,
                            TD.DataVoo ,
                            TD.IdPiloto ,
                            TD.Nome_Piloto ,
                            TD.Tot_partida ,
                            TD.CodAncPilot ,
                            TD.id_Piloto
                 )
        SELECT  R.DATA ,
                DataV = IIF(LEN(LTRIM(RTRIM(R.DataV))) > 0, R.DataV, LeftT.DataVoo) , --Nos Campos que são vazios devem ser assim
                Ano = ISNULL(R.Ano, LeftT.Ano) , --Nos Campos que são nulos devem ser assim
                Mes = ISNULL(R.Mes, LeftT.Mes) ,
                DT = ISNULL(R.DT, LeftT.DT) ,
                Atv = ISNULL(R.Atv, LeftT.Atv) ,
                Fim = ISNULL(R.Fim, LeftT.Fim) ,
                JornIni = ISNULL(R.JornIni, LeftT.JornIni) ,
                JornRefIni = ISNULL(R.JornRefIni, LeftT.JornRefIni) ,
                JornRefFin = ISNULL(R.JornRefFin, LeftT.JornRefFin) ,
                JornFina = ISNULL(R.JornFina, LeftT.JornFina) ,
                IdPiloto = ISNULL(R.IdPiloto, LeftT.IdPiloto) ,
                Nome_Piloto = ISNULL(R.Nome_Piloto, LeftT.Nome_Piloto) ,
                Tot_partida = ISNULL(R.Tot_partida, LeftT.Tot_partida) ,
                Modelo = ISNULL(R.Modelo, LeftT.Modelo) ,
                MESVoo = ISNULL(R.MESVoo, LeftT.MESVoo) ,
                ANOVoo = ISNULL(R.ANOVoo, LeftT.ANOVoo) ,
                subt = ISNULL(R.subt, LeftT.subt) ,
                CodAncPilot = ISNULL(R.CodAncPilot, LeftT.CodAncPilot)
        FROM    SegundaCTE AS R
                LEFT JOIN Tbl_DiarioFrotaClone LeftT ON R.IdPiloto = LeftT.IdPiloto
                                                        AND R.DATA = CONVERT(VARCHAR, LeftT.DataVoo, 103) --Acertar qual e o Criterio do Left
        ORDER BY R.DATA
    OPTION  ( MAXRECURSION 0 );


    Wesley Neves - Brasilia-DF

     
    wesley.si.neves@gmail.com
    MTA-SQL Server
    MTA- Web Development
    Analista Desenvolvedor.NET
    Pós-Graduando em Banco de Dados 
    "Se a resposta for útil ou ajudar ,não esqueça de marcar"




    Wesley Neves

    • Marcado como Resposta Wsti quinta-feira, 13 de julho de 2017 14:19
    sexta-feira, 7 de julho de 2017 16:43
  • Bom Dia Wesley. 

    Desculpa amigo. 

    mas nao consegui fazer funcionar assim. Nao estou conseguindo operar o case.

    Meu sql é o 2008.

    vc poderia me ajudar.

    seria assim. Case when  CodAncPilot da tbl DiarioClone  = null  então  substituir o o campos da tabela diariofrota ( Nome_Piloto,JornIni

    JornRefIni,JornRefFin,JornFina  pelos mesmos campos da tbl_diariofrotaClone que estarão preenchidos) e carregar o campo tipo q so existe na tblDiarioFrotaClone.

    Mais uma vez obrigado pela ajuda.

    quarta-feira, 12 de julho de 2017 15:02
  • Nao entendi muito bem o processo....

    Mas se é uma condicional para trazer valores diferentes, ja pensou em usar uma funcao que retorne o desejado de acordo com as entradas ??

    quarta-feira, 12 de julho de 2017 15:48