Inquiridor
Case para um mesmo campo

Pergunta
-
Boa noite,
Talvez seja difícil eu explicar, mas la vai:
Tenho um campo "groupname" onde eu quero separar duas strings "%full" e "%diff" e retornar a data mais recente.
Fiz o seguinte Case:
bestFULLjobdatetime =
Case
WHEN (groupname like '%FULL')
THEN (MAX(jobdatetime))
ELSE null
END,
bestDIFFjobdatetime =
CASE WHEN (groupname like '%DIFF%')
THEN (MAX(jobdatetime))
ELSE null
END
O problema é que ele esta retornando a data de todos os dias e não somente o mais recente como eu desejo.
A ideia é saber quando foi o ultimo backup diff e full, na mesma linha se possivel.
O mais perto que eu cheguei foi:
server full diff
xxxx null 2/2/08
xxxx 3/2/08 null
yyyy null 2/2/08
yyyy 3/2/08 null
Agradeço qualquer ajuda.
Thiago
Todas as Respostas
-
Thiago,
Veja se com exemplo SQL resolve (como não foi passado o SQL completo, será necessário alterar o nome da tabela) :
Code Snippetselect
max(jobdatetime) as jobdatetime,
server,
max(Case
WHEN tipojob = 'Full' THEN jobdatetime
else Null end) as bestFULLjobdatetime,
max(Case
WHEN tipojob = 'Diff' THEN jobdatetime
else Null end) as bestDIFFjobdatetime
from
(select jobdatetime,
server,
Case
WHEN (upper(groupname) like '%FULL%') THEN 'Full'
WHEN (upper(groupname) like '%DIFF%') THEN 'Diff'
ELSE 'Outros' END As tipojob
from nome_tabela) as tmp_dados
group by server, tipojob
order
by serverAjude a melhorar o nosso Fórum!
Não esqueça de marca a mensagem como "útil", caso tenha ajudado. -
Laercio,
Pode ter sido falha minha, eu realmente não tenho tant experiencia em queries, mas não funcionoou não.
Falhei em não por toda a query da primeira vez. Se puder dar uma olhada acho que deve ser muito simples mesmo a solução.
USE BackupReport
DECLARE @mask INT
SET @mask = 0x70124
DECLARE @horizon_date SMALLDATETIME -- how far back to look for successful backups
SET @horizon_date = getdate() - 7
SELECT DISTINCT mm.clientfqname 'Client Name',
mm.serverfqname 'Server Name',
CONVERT ( VARCHAR ,mm.bestFULLjobdatetime, 101) 'FULL Successful Backup' ,
CONVERT ( VARCHAR ,mm.bestDIFFjobdatetime, 101) 'DIFF Successful Backup'
FROM (SELECT DISTINCT client_id, clientfqname, serverfqname,
bestFULLjobdatetime =
Case
WHEN (groupname like '%FULL')
THEN (MAX(jobdatetime))
ELSE null
END,
bestDIFFjobdatetime =
CASE WHEN (groupname like '%DIFF%')
THEN (MAX(jobdatetime))
ELSE null
END
FROM v_backuplogall
WHERE jobdatetime > @horizon_date
AND (errorset IS NOT NULL AND 0 = errorset&~@mask)
AND serverfqname = 'USMDLSDOWB016'
GROUP BY client_id, clientfqname, serverfqname, groupname, jobdatetime) mm
LEFT OUTER JOIN v_backuplogall bl ON mm.bestFULLjobdatetime = bl.jobdatetime
AND mm.client_id = bl.client_id
AND mm.bestDIFFjobdatetime = bl.jobdatetime
WHERE bl.ignoreuntildatetime<CURRENT_TIMESTAMP OR bl.ignoreuntildatetime IS NULL
GROUP BY mm.client_id, mm.clientfqname, mm.serverfqname, mm.bestFULLjobdatetime, mm.bestDIFFjobdatetime
--ORDER BY mm.clientfqname, mm.serverfqname, mm.bestFULLjobdatetime, mm.bestDIFFjobdatetime
Obrigado mais uma vez pela ajuda -
Ah Sim.
A forma como eu gostaria de ter o resultado é:
server full diffAlgo assim.
xxxx 07/03 10/03
yyyy 07/03 09/03
Eu achei que o MAX(jobdatetime) me mostraria somente o maior valor que existe dentro do campo, nesse caso a data mais recente, mas por algum motivo ele mostra todas as ocorrencias dentro do periodo especificado, separando os campos Full e Diff, mas me mostrando todas as entradas..
Não entendo isso.
Valeu