Total de chamados abertos no mês atual

SELECT COUNT(id) AS total_chamados FROM glpi_tickets WHERE YEAR(date) = YEAR(CURRENT_DATE()) AND MONTH(date) = MONTH(CURRENT_DATE()) AND is_deleted = 0;


Total de chamados fechados no mês atual

SELECT count(id) AS total_fechados FROM glpi_tickets WHERE status = 6 AND is_deleted = 0 AND YEAR(closedate) = YEAR(CURRENT_DATE) AND MONTH(closedate) = MONTH(CURRENT_DATE)


Top 10 categorias no mês atual

SELECT cat.completename AS "Categoria", COUNT(t.id) AS "Total de Chamados" FROM glpi_tickets t JOIN glpi_itilcategories cat ON t.itilcategories_id = cat.id WHERE t.date >= DATE_FORMAT(NOW(), '%Y-%m-01 00:00:00') AND t.date <= NOW() GROUP BY cat.completename ORDER BY COUNT(t.id) DESC LIMIT 10;


Top 10 Técnicos com chamados resolvidos no mês atual

SELECT u.firstname AS "Nome", u.realname AS "Sobrenome", COUNT(t.id) AS "Total de Chamados" FROM glpi_tickets t INNER JOIN glpi_tickets_users tu ON t.id = tu.tickets_id AND tu.type = 2 -- type 2 representa o técnico/atribuído INNER JOIN glpi_users u ON tu.users_id = u.id WHERE t.is_deleted = 0 -- Ignora chamados excluídos AND MONTH(t.date) = MONTH(CURRENT_DATE()) AND YEAR(t.date) = YEAR(CURRENT_DATE()) GROUP BY u.id, u.firstname, u.realname ORDER BY "Total de Chamados" DESC LIMIT 10;

Quantidades do total de chamados, SLA cumpridos, não cumpridos (estourado) e percetual do cumprimento do SLA

SELECT 
    COUNT(t.id) AS total_chamados,
    SUM(CASE WHEN t.solvedate <= t.time_to_resolve THEN 1 ELSE 0 END) AS sla_cumprido,
    SUM(CASE WHEN t.solvedate > t.time_to_resolve THEN 1 ELSE 0 END) AS sla_estourado,
    ROUND((SUM(CASE WHEN t.solvedate <= t.time_to_resolve THEN 1 ELSE 0 END) * 100.0) / COUNT(t.id), 2) AS percentual_cumprido
FROM glpi_tickets t
WHERE t.status IN (5, 6) -- 5: Solucionado, 6: Fechado
  AND t.time_to_resolve IS NOT NULL -- Garante que o chamado tinha SLA ativo
  AND MONTH(t.solvedate) = MONTH(CURRENT_DATE())
  AND YEAR(t.solvedate) = YEAR(CURRENT_DATE())

Evolução mensal comparativa por status dos chamados do ano atual

SELECT 
    -- Agrupamento por Ano e Mês (Ano-Mês)
    DATE_FORMAT(t.date, '%Y-%m') AS Mes,
    
    -- Tradução numérica do status do GLPI para nomes amigáveis
    CASE t.status
        WHEN 1 THEN 'Novo'
        WHEN 2 THEN 'Em andamento (Atribuição)'
        WHEN 3 THEN 'Em andamento (Planejamento)'
        WHEN 4 THEN 'Pendente'
        WHEN 5 THEN 'Solucionado'
        WHEN 6 THEN 'Fechado'
        ELSE 'Outro'
    END AS Status_Chamado,
    
    -- Quantidade total de chamados
    COUNT(t.id) AS Total_Chamados

FROM glpi_tickets t

WHERE 
    -- Filtra apenas para o ano atual (2026)
    YEAR(t.date) = YEAR(CURRENT_DATE())
    AND t.is_deleted = 0 -- Remove chamados deletados

GROUP BY 
    DATE_FORMAT(t.date, '%Y-%m'), 
    t.status

ORDER BY 
    Mes ASC, 
    Total_Chamados DESC;

Equipamentos por Status

SELECT 

    CASE 

        WHEN state.name IS NOT NULL THEN state.name

        ELSE 'Não Definido'

    END AS status_equipamento,

    COUNT(comp.id) AS total_equipamentos

FROM glpi_computers AS comp

LEFT JOIN glpi_states AS state ON comp.states_id = state.id

WHERE comp.is_deleted = 0

GROUP BY 1

ORDER BY total_equipamentos DESC

Contratos vencendo

SELECT 

    c.id AS "ID do Contrato",

    c.name AS "Nome do Contrato",

    c.num AS "Número",

    c.begin_date AS "Data de Início",

    -- Calcula a data de término com base na data de início e duração (em meses)

    DATE_ADD(c.begin_date, INTERVAL c.duration MONTH) AS "Data de Término",

    DATEDIFF(DATE_ADD(c.begin_date, INTERVAL c.duration MONTH), CURDATE()) AS "Dias Restantes",

    c.notice AS "Aviso Prévio (Meses)",

    c.accounting_number AS "Número da Conta",

    sc.name AS "Fornecedor"

FROM glpi_contracts c

LEFT JOIN glpi_suppliers sc ON c.id = sc.id WHERE c.is_deleted = 0

  -- Condição: Exclui contratos que já passaram da data de término

  AND DATE_ADD(c.begin_date, INTERVAL c.duration MONTH) >= CURDATE()

  -- Condição: Filtra apenas contratos que vencem nos próximos 90 dias

  AND DATE_ADD(c.begin_date, INTERVAL c.duration MONTH) <= DATE_ADD(CURDATE(), INTERVAL 90 DAY)

ORDER BY "Data de Término" ASC;

MTTR

SELECT 

    -- Agrupamento opcional (ex: por técnico, categoria ou status)

    -- t.assigned_to AS tecnico, 

    

    -- Correção da linha 9: Cálculo do MTTR convertido para horas e arredondado

    ROUND(

        SUM(TIMESTAMPDIFF(SECOND, t.date, t.solvedate)) / 3600 / COUNT(t.id), 

        2

    ) AS mttr_horas,

    

    -- Total de chamados computados

    COUNT(t.id) AS total_chamados


FROM 

    glpi_tickets AS t -- Substitua 'chamados' pelo nome real da sua tabela


WHERE 

    t.solvedate IS NOT NULL -- Garante que o chamado foi resolvido

    AND t.solvedate >= t.date -- Evita erros de datas invertidas


-- GROUP BY t.assigned_to -- Descomente se quiser agrupar o resultado

;


Top 10 técnicos com maior quantidade e porcentagem de SLA estourado no ano atual (2026)


WITH RankedTechs AS (

    SELECT 

        u.firstname AS primeiro_nome,

        u.realname AS sobrenome,

        COUNT(t.id) AS total_chamados,

        

        -- Soma os chamados que estouraram o SLA (Solucionados/Fechados atrasados OU abertos já vencidos)

        SUM(CASE 

                WHEN t.status IN (5, 6) AND t.solvedate > t.time_to_resolve THEN 1 

                WHEN t.status NOT IN (5, 6) AND NOW() > t.time_to_resolve THEN 1 

                ELSE 0 

            END) AS chamados_estourados,

        

        -- Cálculo da Porcentagem de SLA Estourado

        ROUND(

            SUM(CASE 

                    WHEN t.status IN (5, 6) AND t.solvedate > t.time_to_resolve THEN 1 

                    WHEN t.status NOT IN (5, 6) AND NOW() > t.time_to_resolve THEN 1 

                    ELSE 0 

                END) * 100.0 / COUNT(t.id), 2

        ) AS porcentagem_estouro

    

    FROM glpi_tickets t

    -- Cruzamento para pegar o usuário técnico atribuído (Tipo de link = 2 para Assign)

    LEFT JOIN glpi_tickets_users tu ON t.id = tu.tickets_id AND tu.type = 2

    LEFT JOIN glpi_users u ON tu.users_id = u.id

    

    -- Filtra apenas chamados criados no ano atual (2026) e que possuem um SLA atribuído

    WHERE YEAR(t.date_creation) = 2026 

      AND t.time_to_resolve IS NOT NULL

      AND u.id IS NOT NULL

      

    GROUP BY u.id, u.firstname, u.realname

)


SELECT 

    CONCAT(COALESCE(primeiro_nome, ''), ' ', COALESCE(sobrenome, '')) AS tecnico,

    total_chamados,

    chamados_estourados,

    CONCAT(porcentagem_estouro, '%') AS taxa_estouro

FROM RankedTechs

WHERE chamados_estourados > 0

ORDER BY chamados_estourados DESC

LIMIT 10;

Total de chamados atrasados do mês atual

SELECT 
    t.id AS "ID do Chamado",
    t.name AS "Título",
    t.date AS "Data de Abertura",
    t.time_to_resolve AS "Prazo Limite",
    u.name AS "Técnico Responsável",
    CASE t.status
        WHEN 1 THEN 'Novo'
        WHEN 2 THEN 'Atribuído'
        WHEN 3 THEN 'Planejado'
        WHEN 4 THEN 'Pendente'
        WHEN 5 THEN 'Solucionado'
        WHEN 6 THEN 'Fechado'
        ELSE 'Desconhecido'
    END AS "Status"

FROM glpi_tickets t
LEFT JOIN glpi_users u ON t.users_id_recipient = u.id -- u.id vincula com quem o chamado está atribuído

-- Filtra chamados que foram abertos no mês atual (ano e mês iguais ao atual)
WHERE YEAR(t.date) = YEAR(CURRENT_DATE) 
  AND MONTH(t.date) = MONTH(CURRENT_DATE)

  -- Filtra chamados que ainda não foram fechados/solucionados (Status padrão: 1, 2, 3, 4)
  AND t.status IN (1, 2, 3, 4)

  -- Filtra apenas os chamados onde a data limite de resolução já passou (e que possuem prazo definido)
  AND t.time_to_resolve IS NOT NULL
  AND t.time_to_resolve < CURRENT_TIMESTAMP

ORDER BY t.time_to_resolve ASC;