none
CTE repetindo informações Erro RRS feed

  • Pergunta

  • Boa Tarde a todos.

    Estou com problema em um Cte, ela esta repetindo os dados. 

    como ela funciona. busco as informações na Tabela DiarioFrota  (

    JornIni - Inicio da jornada de trabalho / jornRefIni - Inicio do Horário de Refeição  / JornRefFin - Final do H. de almoço /jornFina - Final do horário de trabalho / Modelo (maquinas Utilizadas) /Total (soma das Horas dia)  / Atv - horário da 1 saída do dia / Fim - horário de chegada .

    o resultado seguia uma ordem de Dias do mês, mesmo que no dia 1,2,3 não houvesse trabalho aparecia com os campos vazios.

    Dai surgiu uma necessidade de criar uma segunda tabela chamada de clone para lançar os dias que houve jornada de trabalho e refeição mas sem Atv, Fim,Nome CodAnc, modelo, etc. 

    quando foi feita essa junção os registros começaram a duplicar. 

    Alguém pode me ajudar. 

    Grato Ricardo.

    ;WITH CTE_DATA  AS ( SELECT   @dthji AS DATA  UNION ALL  SELECT   DATEADD(DAY, 1, DATA) FROM CTE_DATA  WHERE    DATA < @dthjf ),
            SegundaCTE  AS ( SELECT Ordem = DENSE_RANK() OVER ( ORDER BY A.DATA ) ,DATA = A.DATA , TD.DataVoo ,  Dia = DAY(A.DATA) ,
            Partida = TD.Partida , Pouso = TD.Pouso , TD.jornIni AS JornIni ,TD.jornRefIni AS JornRefIni ,TD.jornRefFin AS JornRefFin , TD.jornFina AS JornFina , TD.id_Piloto , TD.Nome_Piloto , TD.Tot_partida , TD.Total ,
            Modelo = 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, '') , TD.CodAncPilot
                --TD.*
      FROM  CTE_DATA A  LEFT JOIN dbo.Tbl_DiarioFrota AS TD ON A.DATA = TD.DataVoo AND TD.Nome_Piloto = 'paulo' ), CTEResultado
              AS ( SELECT   CT.Ordem ,   CT.DATA ,  CT.DataVoo ,  CT.Dia ,
                            CT.Modelo , Atv = MIN(CT.Partida) ,  Fim = MAX(CT.Pouso) , JornIni = MAX(CT.JornIni) ,
                            jornRefIni = MAX(CT.JornRefIni) , jornRefFin = MAX(CT.JornRefFin) ,
                            jornFina = MAX(CT.JornFina) ,CT.id_Piloto ,CT.Nome_Piloto ,CT.CodAncPilot , Total = SUM(CT.Total)
                   FROM     SegundaCTE CT
                   GROUP BY CT.Ordem , CT.id_Piloto , CT.Modelo , CT.DATA , CT.DataVoo , CT.Dia ,  CT.Nome_Piloto ,CT.CodAncPilot )
     SELECT  CT.Ordem , CT.DATA , DataVoo = ISNULL(CONVERT(VARCHAR, CT.DataVoo, 103), '') , DataVooFrotaClone = LEFTClone.DataVoo ,
                CT.Dia , CT.Atv ,CT.Fim , JornIni = ISNULL(CT.JornIni ,LEFTClone.jornIni), jornRefIni  =ISNULL(CT.jornRefIni ,LEFTClone.jornRefIni), jornRefFin =ISNULL(CT.jornRefFin ,LEFTClone.jornRefFin), 
                jornFina  =ISNULL(CT.jornFina ,LEFTClone.jornFina),CT.id_Piloto , CT.Nome_Piloto , CT.CodAncPilot , CT.Modelo , AnoVoo = YEAR(CT.DataVoo) ,
                MesVoo = DATENAME(MONTH, CT.DataVoo) ,  Total = ISNULL(CT.Total, 0) , TotalGeral = SUM(CT.Total) OVER ( )
        FROM    CTEResultado CT LEFT JOIN dbo.Tbl_DiarioFrotaClone AS LEFTClone ON LEFTClone.DataVoo = CT.DATA OPTION(MAXRECURSION 0)
    

    quinta-feira, 23 de novembro de 2017 14:58

Respostas

  • veja se a seguinte solução resolve, eu me lembro dessa query, acredito que eu te ajudei,

    ;WITH CTE_DATA
    AS (SELECT @dthji AS DATA
        UNION ALL
        SELECT DATEADD(DAY, 1, CTE_DATA.DATA)
        FROM CTE_DATA
        WHERE CTE_DATA.DATA < @dthjf
       ),
          SegundaCTE
    AS (SELECT Ordem = DENSE_RANK() OVER (ORDER BY A.DATA),
               DATA = A.DATA,
               TD.DataVoo,
               Dia = DAY(A.DATA),
               Partida = TD.Partida,
               Pouso = TD.Pouso,
               TD.jornIni AS JornIni,
               TD.jornRefIni AS JornRefIni,
               TD.jornRefFin AS JornRefFin,
               TD.jornFina AS JornFina,
               TD.id_Piloto,
               TD.Nome_Piloto,
               TD.Tot_partida,
               TD.Total,
               Modelo = 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,
                                 ''
                             ),
               TD.CodAncPilot
        --TD.*
        FROM CTE_DATA A
            LEFT JOIN dbo.Tbl_DiarioFrota AS TD
                ON A.DATA = TD.DataVoo
                   AND TD.Nome_Piloto = 'paulo'
       ),
          CTEResultado
    AS (SELECT CT.Ordem,
               CT.DATA,
               CT.DataVoo,
               CT.Dia,
               CT.Modelo,
               Atv = MIN(CT.Partida),
               Fim = MAX(CT.Pouso),
               JornIni = MAX(CT.JornIni),
               jornRefIni = MAX(CT.JornRefIni),
               jornRefFin = MAX(CT.JornRefFin),
               jornFina = MAX(CT.JornFina),
               CT.id_Piloto,
               CT.Nome_Piloto,
               CT.CodAncPilot,
               Total = SUM(CT.Total)
        FROM SegundaCTE CT
        GROUP BY CT.Ordem,
                 CT.id_Piloto,
                 CT.Modelo,
                 CT.DATA,
                 CT.DataVoo,
                 CT.Dia,
                 CT.Nome_Piloto,
                 CT.CodAncPilot
       )
    SELECT DISTINCT CT.Ordem,
           CT.DATA,
           DataVoo = ISNULL(CONVERT(VARCHAR, CT.DataVoo, 103), ''),
           DataVooFrotaClone = LEFTClone.DataVoo,
           CT.Dia,
           CT.Atv,
           CT.Fim,
           JornIni = ISNULL(CT.JornIni, LEFTClone.JornIni),
           jornRefIni = ISNULL(CT.jornRefIni, LEFTClone.jornRefIni),
           jornRefFin = ISNULL(CT.jornRefFin, LEFTClone.jornRefFin),
           jornFina = ISNULL(CT.jornFina, LEFTClone.jornFina),
           CT.id_Piloto,
           CT.Nome_Piloto,
           CT.CodAncPilot,
           CT.Modelo,
           AnoVoo = YEAR(CT.DataVoo),
           MesVoo = DATENAME(MONTH, CT.DataVoo),
           Total = ISNULL(CT.Total, 0),
           TotalGeral = SUM(CT.Total) OVER ()
    FROM CTEResultado CT
        LEFT JOIN dbo.Tbl_DiarioFrotaClone AS LEFTClone
            ON LEFTClone.DataVoo = CT.DATA
    OPTION (MAXRECURSION 0);

    caso não resolva , precisaremos de mais dados , um conjunto de dados seria o ideal , tem como vc fazer um insert into dessa query  e colocar em algum arquivo?

    Wesley Neves - Brasilia-DF

     
    https://wesleyneves.wordpress.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, 21 de dezembro de 2017 18:36
    quarta-feira, 29 de novembro de 2017 10:24

Todas as Respostas

  • Bom dia, pessoal.

    Ninguém pode me ajudar ?

    Estou precisando muito resolver este problema.

    att, ricardo.

    segunda-feira, 27 de novembro de 2017 13:53
  • Posta o retorno do resultado , por favor.

    Wesley Neves - Brasilia-DF

     
    https://wesleyneves.wordpress.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


    • Editado Wesley Neves segunda-feira, 27 de novembro de 2017 18:20 correção
    segunda-feira, 27 de novembro de 2017 18:20
  • quarta-feira, 29 de novembro de 2017 09:34
  • veja se a seguinte solução resolve, eu me lembro dessa query, acredito que eu te ajudei,

    ;WITH CTE_DATA
    AS (SELECT @dthji AS DATA
        UNION ALL
        SELECT DATEADD(DAY, 1, CTE_DATA.DATA)
        FROM CTE_DATA
        WHERE CTE_DATA.DATA < @dthjf
       ),
          SegundaCTE
    AS (SELECT Ordem = DENSE_RANK() OVER (ORDER BY A.DATA),
               DATA = A.DATA,
               TD.DataVoo,
               Dia = DAY(A.DATA),
               Partida = TD.Partida,
               Pouso = TD.Pouso,
               TD.jornIni AS JornIni,
               TD.jornRefIni AS JornRefIni,
               TD.jornRefFin AS JornRefFin,
               TD.jornFina AS JornFina,
               TD.id_Piloto,
               TD.Nome_Piloto,
               TD.Tot_partida,
               TD.Total,
               Modelo = 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,
                                 ''
                             ),
               TD.CodAncPilot
        --TD.*
        FROM CTE_DATA A
            LEFT JOIN dbo.Tbl_DiarioFrota AS TD
                ON A.DATA = TD.DataVoo
                   AND TD.Nome_Piloto = 'paulo'
       ),
          CTEResultado
    AS (SELECT CT.Ordem,
               CT.DATA,
               CT.DataVoo,
               CT.Dia,
               CT.Modelo,
               Atv = MIN(CT.Partida),
               Fim = MAX(CT.Pouso),
               JornIni = MAX(CT.JornIni),
               jornRefIni = MAX(CT.JornRefIni),
               jornRefFin = MAX(CT.JornRefFin),
               jornFina = MAX(CT.JornFina),
               CT.id_Piloto,
               CT.Nome_Piloto,
               CT.CodAncPilot,
               Total = SUM(CT.Total)
        FROM SegundaCTE CT
        GROUP BY CT.Ordem,
                 CT.id_Piloto,
                 CT.Modelo,
                 CT.DATA,
                 CT.DataVoo,
                 CT.Dia,
                 CT.Nome_Piloto,
                 CT.CodAncPilot
       )
    SELECT DISTINCT CT.Ordem,
           CT.DATA,
           DataVoo = ISNULL(CONVERT(VARCHAR, CT.DataVoo, 103), ''),
           DataVooFrotaClone = LEFTClone.DataVoo,
           CT.Dia,
           CT.Atv,
           CT.Fim,
           JornIni = ISNULL(CT.JornIni, LEFTClone.JornIni),
           jornRefIni = ISNULL(CT.jornRefIni, LEFTClone.jornRefIni),
           jornRefFin = ISNULL(CT.jornRefFin, LEFTClone.jornRefFin),
           jornFina = ISNULL(CT.jornFina, LEFTClone.jornFina),
           CT.id_Piloto,
           CT.Nome_Piloto,
           CT.CodAncPilot,
           CT.Modelo,
           AnoVoo = YEAR(CT.DataVoo),
           MesVoo = DATENAME(MONTH, CT.DataVoo),
           Total = ISNULL(CT.Total, 0),
           TotalGeral = SUM(CT.Total) OVER ()
    FROM CTEResultado CT
        LEFT JOIN dbo.Tbl_DiarioFrotaClone AS LEFTClone
            ON LEFTClone.DataVoo = CT.DATA
    OPTION (MAXRECURSION 0);

    caso não resolva , precisaremos de mais dados , um conjunto de dados seria o ideal , tem como vc fazer um insert into dessa query  e colocar em algum arquivo?

    Wesley Neves - Brasilia-DF

     
    https://wesleyneves.wordpress.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, 21 de dezembro de 2017 18:36
    quarta-feira, 29 de novembro de 2017 10:24
  • Wesley, bom dia.

    aparentemente o erro de duplicação esta acontecendo pq na tbl diarioclone esta buscando DataVoo como filtro e o segundo filtro que seria o nome ele esta deixando passar. na imagem abaixo repare que datavooclone em azul se repete os dias 07 e 08  sendo que a 1 linha de cada dia estão corretas a 2 linha desses dias ele tras do CARLOS (IMG 2) . creio que mudando para realizar um filtro usando os campos Id_piloto e CodAncpilot este problema ira sanar. 

    img1

    img 2

    Obrigado pela ajuda.

    Att. Ricardo

    quinta-feira, 30 de novembro de 2017 12:53
  • Pessoal, um feliz natal antecipado.

    Com relação ao problema de duplicar os registros descobri que na estava na 1 parte da cte.

    ja resolvi. queria aproveitar e agradecer ao wesley, pois sem ajuda dele não conseguiria montar esta consulta. 

    att, ricardo. 

    quinta-feira, 21 de dezembro de 2017 18:36
  • Bom  Fim de ano pra vc tambem .qualquer coisa estamos aqui

    Wesley Neves

    quinta-feira, 21 de dezembro de 2017 19:15