Usuário com melhor resposta
CTE ajuda.

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