none
Case para um mesmo campo RRS feed

  • 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
    sábado, 8 de março de 2008 00:32

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 Snippet

     

    select

       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 server

     

     

    Ajude a melhorar o nosso Fórum!
    Não esqueça de marca a mensagem como "útil", caso tenha ajudado.

    sábado, 8 de março de 2008 01:29
  • 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

    terça-feira, 11 de março de 2008 00:11
  • Ah Sim.

    A forma como eu gostaria de ter o resultado é:

    server             full              diff
    xxxx               07/03         10/03
    yyyy               07/03          09/03

    Algo assim.
    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
    terça-feira, 11 de março de 2008 00:16