Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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
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??
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
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!!
Feliz em poder auxiliar. até mais.
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