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;
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
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;
