bacoco 0 Denunciar post Postado Julho 10, 2013 Olá, Preciso gerar um relatório que calcule a porcentagem de preventivas não concluídas de um funcionário e exiba no relatório Para fazer isso criei uma tabela onde guardo nela as informações como nome do funcionário, porcentagem e o mês referente. A questão é que não posso por exemplo gerar 2 informações para um mesmo funcionário em um mesmo mês, então fiz o seguinte trigger abaixo: CREATE TRIGGER `preventiva_AUPD` AFTER UPDATE ON preventiva FOR EACH ROW -- Edit trigger body code below this line. Do not edit lines above this one if exists (select idFuncionario as fatoIdFun,data from fato_performance_individual where idFuncionario = NEW.idFuncionario and data = NEW.data) then UPDATE `preventiva`.`fato_performance_individual` INNER JOIN (SELECT preventiva.idFuncionario,nome,count(idPreventiva) * t.factor AS pct,MONTH(data) as MES,data FROM preventiva INNER JOIN funcionario on funcionario.idFuncionario = preventiva.idFuncionario JOIN (SELECT 100/COUNT(*) AS factor FROM preventiva where idFuncionario = NEW.idFuncionario and data= NEW.data ) AS t where preventiva.idFuncionario = NEW.idFuncionario and data= NEW.data and concluida = 0 GROUP BY data,concluida) as f -- Tabela para o join ON `preventiva`.`fato_performance_individual`.idFuncionario = f.idFuncionario SET `porcentagem` = f.pct WHERE `fato_performance_individual`.idFuncionario = NEW.idFuncionario and `fato_performance_individual`.data = NEW.data; else INSERT INTO `preventiva`.`fato_performance_individual` (`idFuncionario`,`Nome`,`porcentagem`,`mes`,`data`) SELECT preventiva.idFuncionario,nome,count(idPreventiva) * t.factor AS pct,MONTH(data) as MES,data FROM preventiva INNER JOIN funcionario on funcionario.idFuncionario = preventiva.idFuncionario JOIN (SELECT 100/COUNT(*) AS factor FROM preventiva where idFuncionario = NEW.idFuncionario and data= NEW.data ) AS t where preventiva.idFuncionario = NEW.idFuncionario and data= NEW.data and concluida = 0 GROUP BY data,concluida; end if; Minha questão é, essa é de fato uma boa solução? É performático fazer isso ? Vou ter muito impacto negativo? Se sim porque? Se algum poder ajudar agradeço. Att Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Julho 10, 2013 Criar uma chave única na tabela (usuario,ano,mes) Esta insersão poderia ser feita via procedure, não ? Até um event para ficar automático. Compartilhar este post Link para o post Compartilhar em outros sites
bacoco 0 Denunciar post Postado Julho 10, 2013 Criar uma chave única na tabela (usuario,ano,mes) Esta insersão poderia ser feita via procedure, não ? Até um event para ficar automático. Olá Motta, como poderia ser feito via procedure ou pelo event? Nesses casos eu não utilizaria recurso desnecessário ? Com relação a chave unica, eu tenho uma PK na tabela porem usada para ID, eu consigo fazer uma chave unica para diversas colunas? como você disse uma chave unica para usuário,ano,mês ? Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Julho 10, 2013 como poderia ser feito via procedure ou pelo event? O que a sua trigger faria, a Procedure faria, a vantagem e que as operações de insert e update não ficariam lentas. Com relação a chave unica, eu tenho uma PK na tabela porem usada para ID, eu consigo fazer uma chave unica para diversas colunas? como você disse uma chave unica para usuário,ano,mês ? Não sei se MySql aceita unique key, creio que sim, mas pode questões de versão, engine etc. Compartilhar este post Link para o post Compartilhar em outros sites
bacoco 0 Denunciar post Postado Julho 10, 2013 O que a sua trigger faria, a Procedure faria, a vantagem e que as operações de insert e update não ficariam lentas. Não sei se MySql aceita unique key, creio que sim, mas pode questões de versão, engine etc. Como eu faria para essa procedure executar para todos os usuários, para todos os meses e anos que possui registro? Porque realmente não quero fazer o update e insert ficarem mais lerdos, visto que essa tabela é muito movimentada e alterada. Vou pesquisar sobre como fazer a unique key. Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Julho 10, 2013 A query básica da procedure e a que geraria o relatório não houvesse a base consolidada. A síntaxe não sei, mas //Cursor do select agregador select xxx, sum(0 xxx from group by xxx //insert na agregadora insert into (); Para rodar de forma automática sei que existe um objeto chamado EVENT. Ajudou ? Compartilhar este post Link para o post Compartilhar em outros sites
bacoco 0 Denunciar post Postado Julho 10, 2013 A query básica da procedure e a que geraria o relatório não houvesse a base consolidada. A síntaxe não sei, mas //Cursor do select agregador select xxx, sum(0 xxx from group by xxx //insert na agregadora insert into (); Para rodar de forma automática sei que existe um objeto chamado EVENT. Ajudou ? Ajudou levantando mais duvidas, vou atras disso que você falou, obrigado Motta Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Julho 10, 2013 Ajudou levantando mais duvidas :) Compartilhar este post Link para o post Compartilhar em outros sites