Jump to content

Archived

This topic is now archived and is closed to further replies.

Laís

Cálculo de porcentagem

Recommended Posts

Olá pessoal!! preciso de uma ajudinha... tenho uma query que me retorna quantos e-mails foram enviados e quantos e-ail foram lidos e preciso calcular a porcentagem de e-mails lidos.Aí vai a query:SELECT Email.Email_ID AS 'ID', Email.Nome AS 'Nome da Campanha', 'Enviados' = ( SELECT COUNT(Email_Dados_ID) FROM Email_Dados WHERE Email_ID = Email.Email_ID ), 'Lidos' = ( SELECT COUNT(Email_Dados_ID) FROM Email_Dados WHERE Email_Dados_ID IN ( SELECT DISTINCT E_D.Email_Dados_ID FROM Email_Dados AS E_D INNER JOIN Email_Dados_Leitura AS E_D_L ON E_D_L.Email_Dados_ID = E_D.Email_Dados_ID WHERE E_D.Email_ID = Email.Email_ID ) ), Sta.Nome AS 'Status' FROM Email INNER JOIN Status AS Sta ON Sta.Status = Email.Status WHERE Email.Status != 'X' Agradeço desde já!!Abraços

Share this post


Link to post
Share on other sites

pelo que entendi, deseja ver qual o percentual de emails enviados foram lidos... bem, mesmo que não seja, uma formula fácil é esta ai.( <total_mails_lidos> / <total_mails_enviados> ) * 100( 125 / 1000 ) * 100 resulta em 12.5, que seria o percentual. Pode ser necessário fazer um cast ou convert para decimal nos campos dentro do parenteses, ai é só testar...use pubsselect ( cast(110 as decimal) / cast(1000 as decimal) ) * 100att,rodcorgus

Share this post


Link to post
Share on other sites

Sim, mas no seu exemplo você setou os valores para fazer a conta.Na minha query os valores de e-mails enviados e e-mails lidos saem de outro select, então não tem como eu usar eles em uma conta entende?Alguém sabe como eu posso fazer isso??

Share this post


Link to post
Share on other sites

Laís. Tudo bem que retorna com outra select, veja código de uma planilha, usada por um cliente meu no sistema que implanto.Se você observar, existem varias subselects que fazem operações matemáticas, retornando de 2 ou 3 querys, apenas um campo resultado.. Neste tipo de consulta, só é importante usar isnull, para não ferrar tudo.É apenas um exemplo de código, mas temos um sistema de informações online, onde cotumamos fazer subconsultas calculando percentuais, ainda mais quando se trata de produtos, que precisamos ordenar por curvas abc, apartir destes percentuais.se quizer, mande a estrutura e um script para popular a tabela, caso possa ajudar.Att,RodcorgusSELECTTRPR.NOME AS REPRESENTANTE,ISNULL((SELECT SUM(ISNULL(B.QUANTIDADE,0)) FROM TMOV A,TITMMOV B WHERE A.IDMOV=B.IDMOV AND A.CODRPR=TMOV.CODRPR AND A.CODTMV IN ('4.1.10') AND A.STATUS<>'C' AND A.CODRPR NOT IN ('0099','0097') AND A.DATAMOVIMENTO>=:PLN_$C$3_D AND A.DATAMOVIMENTO<=:PLN_$C$4_D ),0) PREVISTO,ISNULL((SELECT SUM(ISNULL(B.QUANTIDADE,0)) FROM TMOV A,TITMMOV B WHERE A.IDMOV=B.IDMOV AND A.CODRPR=TMOV.CODRPR AND A.CODTMV IN ('2.1.02') AND A.SERIE IN ('PMV','PV', 'PVM', 'PVB','PVBS') AND A.STATUS<>'C' AND A.CODRPR NOT IN ('0099','0097') AND A.DATASAIDA>=:PLN_$C$3_D AND A.DATASAIDA<=:PLN_$C$4_D ),0) REALIZADO,((ISNULL((SELECT SUM(ISNULL(B.QUANTIDADE,0)) FROM TMOV A,TITMMOV B WHERE A.IDMOV=B.IDMOV AND A.CODRPR=TMOV.CODRPR AND A.CODTMV IN ('4.1.10') AND A.STATUS<>'C' AND A.CODRPR NOT IN ('0099','0097') AND A.DATAMOVIMENTO>=:PLN_$C$3_D AND A.DATAMOVIMENTO<=:PLN_$C$4_D ),0) ) /:PLN_$B$5_S * :PLN_$B$6_S ) ,(ISNULL((SELECT SUM(ISNULL(B.QUANTIDADE,0)) FROM TMOV A,TITMMOV B WHERE A.IDMOV=B.IDMOV AND A.CODRPR=TMOV.CODRPR AND A.CODTMV IN ('2.1.02') AND A.SERIE IN ('PMV','PV', 'PVM', 'PVB','PVBS') AND A.STATUS<>'C' AND A.CODRPR NOT IN ('0099','0097') AND A.DATASAIDA>=:PLN_$C$3_D AND A.DATASAIDA<=:PLN_$C$4_D ),0) /((ISNULL((SELECT SUM(ISNULL(B.QUANTIDADE,0)) FROM TMOV A,TITMMOV B WHERE A.IDMOV=B.IDMOV AND A.CODRPR=TMOV.CODRPR AND A.CODTMV IN ('4.1.10') AND A.STATUS<>'C' AND A.CODRPR NOT IN ('0099','0097') AND A.DATAMOVIMENTO>=:PLN_$C$3_D AND A.DATAMOVIMENTO<=:PLN_$C$4_D ),0) ) /:PLN_$B$5_S * :PLN_$B$6_S )),(((ISNULL((SELECT SUM(ISNULL(B.QUANTIDADE,0)) FROM TMOV A,TITMMOV B WHERE A.IDMOV=B.IDMOV AND A.CODRPR=TMOV.CODRPR AND A.CODTMV IN ('4.1.10') AND A.STATUS<>'C' AND A.CODRPR NOT IN ('0099','0097') AND A.DATAMOVIMENTO>=:PLN_$C$3_D AND A.DATAMOVIMENTO<=:PLN_$C$4_D ),0) ) /:PLN_$B$5_S * :PLN_$B$6_S ) -ISNULL((SELECT SUM(ISNULL(B.QUANTIDADE,0)) FROM TMOV A,TITMMOV B WHERE A.IDMOV=B.IDMOV AND A.CODRPR=TMOV.CODRPR AND A.CODTMV IN ('2.1.02') AND A.SERIE IN ('PMV','PV', 'PVM', 'PVB','PVBS') AND A.STATUS<>'C' AND A.CODRPR NOT IN ('0099','0097') AND A.DATASAIDA>=:PLN_$C$3_D AND A.DATASAIDA<=:PLN_$C$4_D ),0)),isnull ((select SUM(isnull (a.QUANTIDADE,0))FROM TMOV A WHERE A.CODRPR=TMOV.CODRPR AND A.CODTMV IN ('2.2.01') AND A.STATUS<>'C' AND A.CODRPR NOT IN ('0099','0097') AND A.DATAMOVIMENTO>=:PLN_$C$3_D AND A.DATAMOVIMENTO<=:PLN_$C$4_D ),0) -ISNULL((SELECT SUM(ISNULL(A.QUANTIDADE,0)) FROM TMOV A WHERE A.CODRPR=TMOV.CODRPR AND A.CODTMV IN ('1.3.01','1.3.02') AND A.STATUS<>'C' AND A.CODRPR NOT IN ('0099','0097') AND A.DATAMOVIMENTO>=:PLN_$C$3_D AND A.DATAMOVIMENTO<=:PLN_$C$4_D ),0) + ISNULL((SELECT SUM(ISNULL(A.QUANTIDADE,0)) FROM TMOV A WHERE A.CODRPR=TMOV.CODRPR AND A.CODTMV IN ('2.2.13') AND A.STATUS<>'C' AND A.CODRPR NOT IN ('0099','0097') AND A.DATAMOVIMENTO>=:PLN_$C$3_D AND A.DATAMOVIMENTO<=:PLN_$C$4_D ),0) QUANTIDADE,ISNULL((SELECT SUM(ISNULL(A.VALORBRUTO,0)) FROM TMOV A WHERE A.CODRPR=TMOV.CODRPR AND A.CODTMV IN ('2.2.01') AND A.STATUS<>'C' AND A.CODRPR NOT IN ('0099','0097') AND A.DATAMOVIMENTO>=:PLN_$C$3_D AND A.DATAMOVIMENTO<=:PLN_$C$4_D ),0)-ISNULL((SELECT SUM(ISNULL(A.VALORBRUTO,0)) FROM TMOV A WHERE A.CODRPR=TMOV.CODRPR AND A.CODTMV IN ('1.3.01','1.3.02') AND A.STATUS<>'C' AND A.CODRPR NOT IN ('0099','0097') AND A.DATAMOVIMENTO>=:PLN_$C$3_D AND A.DATAMOVIMENTO<=:PLN_$C$4_D ),0) ,(ISNULL((SELECT SUM(ISNULL(A.VALORFRETE,0)) FROM TMOV A WHERE A.CODRPR=TMOV.CODRPR AND A.CODTMV='2.2.13' AND A.STATUS<>'C' AND A.CODRPR NOT IN ('0099','0097') AND A.DATAMOVIMENTO>=:PLN_$C$3_D AND A.DATAMOVIMENTO<=:PLN_$C$4_D ),0)+ISNULL((SELECT SUM(ISNULL(C.CUSTOFABRICACAO,0)) FROM TMOV A INNER JOIN TITMMOV B ON(A.IDMOV=B.IDMOV) INNER JOIN TITMMOVCOMPL C ON (B.IDMOV=C.IDMOV AND B.NSEQITMMOV=C.NSEQITMMOV) WHERE A.CODRPR=TMOV.CODRPR AND A.CODTMV='2.2.13' AND A.STATUS<>'C' AND A.CODRPR NOT IN ('0099','0097') AND A.DATAMOVIMENTO>=:PLN_$C$3_D AND A.DATAMOVIMENTO<=:PLN_$C$4_D ),0)+ISNULL((SELECT SUM(ISNULL(C.VALOR,0)) FROM TMOV A INNER JOIN TITMMOV B ON(A.IDMOV=B.IDMOV) INNER JOIN TTRBMOV C ON (B.IDMOV=C.IDMOV AND B.NSEQITMMOV=C.NSEQITMMOV) WHERE A.CODRPR=TMOV.CODRPR AND A.CODTMV='2.2.13' AND A.STATUS<>'C' AND A.CODRPR NOT IN ('0099','0097') AND A.DATAMOVIMENTO>=:PLN_$C$3_D AND A.DATAMOVIMENTO<=:PLN_$C$4_D ),0)),isnull(( select SUM((b.MARGEMLUCRO/100)*a.VALORBRUTO)FROM TMOV A,TMOVCOMPL BWHERE A.IDMOV=B.IDMOV AND A.CODRPR=TMOV.CODRPR AND A.CODTMV IN ('2.2.01') AND A.STATUS<>'C' AND A.CODRPR NOT IN ('0099','0097') AND A.DATAMOVIMENTO>=:PLN_$C$3_D AND A.DATAMOVIMENTO<=:PLN_$C$4_D ),0)-ISNULL((SELECT SUM((B.MARGEMLUCRO/100)*A.VALORBRUTO) FROM TMOV A,TMOVCOMPL BWHERE A.IDMOV=B.IDMOV AND A.CODRPR=TMOV.CODRPR AND A.CODTMV IN ('1.3.01','1.3.02') AND A.STATUS<>'C' AND A.CODRPR NOT IN ('0099','0097') AND A.DATAMOVIMENTO>=:PLN_$C$3_D AND A.DATAMOVIMENTO<=:PLN_$C$4_D ),0) , ISNULL((SELECT SUM(ISNULL(A.VALORBRUTO,0)) FROM TMOV A WHERE A.CODRPR=TMOV.CODRPR AND A.CODTMV IN ('2.1.02') AND A.STATUS='A' AND A.CODRPR NOT IN ('0099','0097') AND A.DATASAIDA>=:PLN_$C$3_D AND A.DATASAIDA<=:PLN_$C$4_D ),0) AFATURAR,ISNULL((SELECT SUM((B.MARGEMLUCRO/100)*A.VALORBRUTO) FROM TMOV A,TMOVCOMPL BWHERE A.IDMOV=B.IDMOV AND A.CODRPR=TMOV.CODRPR AND A.CODTMV IN ('2.1.02') AND A.STATUS='A' AND A.CODRPR NOT IN ('0099','0097') AND A.DATASAIDA>=:PLN_$C$3_D AND A.DATASAIDA<=:PLN_$C$4_D ),0) LUCROFATURARFROM TMOV,TRPrWHERETMOV.CODRPR=TRPR.CODRPR ANDTMOV.STATUS<>'C' AND trpr.inativo=0 andTMOV.CODRPR NOT IN ('0099','0097') ANDTMOV.DATAMOVIMENTO>=:PLN_$C$3_D ANDTMOV.DATAMOVIMENTO<=:PLN_$C$4_D GROUP BY TRPR.NOME,TMOV.CODRPRORDER BY REPRESENTANTE

Share this post


Link to post
Share on other sites

Valeeeeu amigo!!

Tava faltando os CASTS e os parênteses rsrs... ficou assim:

SELECT 	Email.Email_ID AS 'ID', 	Email.Nome AS 'Nome da Campanha', 	'Enviados' = ( 			SELECT 				COUNT(Email_Dados_ID) 			FROM 				Email_Dados 			WHERE 				Email_ID = Email.Email_ID 			),	'Lidos' = ( 			SELECT 				COUNT(Email_Dados_ID) 			FROM				Email_Dados 			WHERE				Email_Dados_ID IN ( 					SELECT DISTINCT 						E_D.Email_Dados_ID 					FROM 						Email_Dados AS E_D						INNER JOIN Email_Dados_Leitura AS E_D_L ON E_D_L.Email_Dados_ID = E_D.Email_Dados_ID					WHERE						E_D.Email_ID = Email.Email_ID 				  )		  ),	'% e-mail enviados' = CAST((CAST(((CAST ((				SELECT 				COUNT(Email_Dados_ID) 			FROM				Email_Dados 			WHERE				Email_Dados_ID IN ( 					SELECT DISTINCT 						E_D.Email_Dados_ID 					FROM 						Email_Dados AS E_D						INNER JOIN Email_Dados_Leitura AS E_D_L ON E_D_L.Email_Dados_ID = E_D.Email_Dados_ID					WHERE						E_D.Email_ID = Email.Email_ID 				  )) AS DECIMAL(6,2))				) * 100 / 				CASE (CAST((SELECT COUNT(Email_Dados_ID) FROM Email_Dados WHERE Email_ID = Email.Email_ID ) AS DECIMAL(6,2)))					WHEN 0 THEN 1				ELSE					CAST((SELECT COUNT(Email_Dados_ID) FROM Email_Dados WHERE Email_ID = Email.Email_ID ) AS DECIMAL(6,2))				END) AS DECIMAL(6,2))) AS VARCHAR(10)) + '%',	 Sta.Nome AS 'Status'FROM 	Email 	INNER JOIN Status AS Sta ON Sta.Status = Email.Status WHERE 	Email.Status != 'X'

Vlw mesmo!!

Share this post


Link to post
Share on other sites

×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.