Usuário com melhor resposta
CTE repetindo informações Erro

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)
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
Todas as Respostas
-
-
- Editado Wesley Neves segunda-feira, 27 de novembro de 2017 18:20 correção
-
-
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
-
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
-
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.
-