none
Select Porcetagem Dias RRS feed

  • Pergunta

  • Galera estou com um problema,tenho que montar um consulta que retorne o valor calcula em porcentagem de forma diária, montei um select para validar o calculo de porcentagem:

     


    Code Snippet

    SELECT '% Contatos Efetivos / Tentativas' AS STATUS,

    SUM(EFETIVO / TENTATIVAS) AS '% TOTAL'

     FROM (

     SELECT

     TENTATIVAS = COUNT(STATUS),

     EFETIVO = CASE WHEN  STATUS IN (3,4,5,6,20,21,26) THEN COUNT (STATUS) ELSE 0 END

     FROM HISTORICO

     WHERE DAY(DAT_INICIO)=08

    AND MONTH (DAT_INICIO)=01

    and year (DAT_INICIO)=2009

     AND DAT_FINAL IS NOT NULL

     

     

     

     

     

     

    O calculo esta funcionando perfeitamente, mas quando montei para ele retornar de forma diária, ele não esta mais realizando o calculo, segue consulta diaria:

     


    Code Snippet

    SELECT '% Contatos Efetivos / Tentativas' AS STATUS,

     SUM ( EFETIVO_DIA_1 / TENTATIVAS_DIA_1) AS '% DIA 1'

     FROM (

     SELECT

     TENTATIVAS_DIA_1 = CASE WHEN DAY(DAT_FINAL) = 10 AND MONTH(DAT_FINAL) = month(getdate()) AND YEAR(DAT_FINAL) = YEAR(GETDATE()) THEN COUNT(STATUS) ELSE 0 END,

    EFETIVO_DIA_1 = CASE WHEN DAY(DAT_FINAL) = 10 AND MONTH(DAT_FINAL) = month(getdate()) AND YEAR(DAT_FINAL) = YEAR(GETDATE()) AND STATUS IN (3,4,5,6,20,21,26) THEN COUNT(STATUS) ELSE 0 END

     FROM HISTORICO

     where DAT_FINAL IS NOT NULL

    GROUP BY HISTORICO.STATUS,DAT_FINAL)BASE

     

     

     

     

     

    Como fazer para ele realizar o calculo ?

     

    O resultado tem que ficar desta forma:


    Code Snippet
    calculo   %calculo
     dia 1        7
     dia 2        4
     dia 3        3
     dia 4        2

     

     


     

    Valeu pela ajuda..

     

    segunda-feira, 12 de janeiro de 2009 15:52

Respostas

  • Boa Noite,

     

    Sinceramente acho que isso não é trabalho para a SQL. A SQL é muito poderosa, mas emitir um relatório desse nível não parece ser algo muito vantajoso. A SQL não dispõe de operadores preparados para tal. Embora seja possível, será difícil de fazer, de manter e possivelmente pouco performático.

     

    Considere utilizar o Analysis Services em conjunto como o SSIS para montar um DW, ou se preferir procure o relatório CROSS TAB do Reporting Services. São soluções mais interessantes que a SQL pura.

     

    Se desejar, segue um esboço de como ficaria em SQL (2005 e superiores)

     

    Code Snippet

    declare @o table (ocorrencia varchar(20), data smalldatetime)

    insert into @o values ('Tentativas','20090101')

    insert into @o values ('Tentativas','20090103')

    insert into @o values ('Tentativas','20090104')

    insert into @o values ('Tentativas','20090104')

    insert into @o values ('Tentativas','20090105')

    insert into @o values ('Contato Efetivo','20090101')

    insert into @o values ('Contato Efetivo','20090101')

    insert into @o values ('Contato Efetivo','20090101')

    insert into @o values ('Contato Efetivo','20090102')

    insert into @o values ('Contato Efetivo','20090102')

    insert into @o values ('Contato Efetivo','20090103')

    insert into @o values ('Contato Efetivo','20090104')

    insert into @o values ('Contato Efetivo','20090104')

    insert into @o values ('Contato Efetivo','20090104')

    insert into @o values ('Contato Efetivo','20090104')

    insert into @o values ('Contato Efetivo','20090105')

    insert into @o values ('Contato Efetivo','20090105')

    insert into @o values ('Contato Efetivo','20090106')

    insert into @o values ('Contato Efetivo','20090107')

    insert into @o values ('Contato Efetivo','20090108')

    insert into @o values ('Contato Efetivo','20090109')

    insert into @o values ('Contato Efetivo','20090109')

    insert into @o values ('Contato Efetivo','20090109')

    insert into @o values ('Contato Efetivo','20090109')

    insert into @o values ('Testes','20090102')

    insert into @o values ('Testes','20090105')

    insert into @o values ('Testes','20090106')

    segunda-feira, 12 de janeiro de 2009 22:42
  •  

     

    -- Converte as datas do mês de janeiro para dias

    ;WITH Janeiro2009 AS (

    SELECT Ocorrencia, DAY(Data) As Dia

    FROM @o WHERE Data >= '20090101' AND Data < '20090201'),

    ResultadoPorStatus AS (

    SELECT Status,

    [0], [1], [2], [3], [4], [5], [6], [7], [8], [9]

    FROM

    (SELECT Ocorrencia As Status, Ocorrencia, Dia

    FROM Janeiro2009) AS ST

    PIVOT

    (

    COUNT(Ocorrencia)

    FOR Dia IN ([0], [1], [2], [3], [4], [5], [6], [7], [8], [9])

    ) AS PV),

    ResultadoTotal AS (

    SELECT 'Total' As Total,

    [0], [1], [2], [3], [4], [5], [6], [7], [8], [9]

    FROM

    (SELECT Ocorrencia, Dia

    FROM Janeiro2009) AS ST

    PIVOT

    (

    COUNT(Ocorrencia)

    FOR Dia IN ([0], [1], [2], [3], [4], [5], [6], [7], [8], [9])

    ) AS PV),

    ResultadoConsolidado AS (

    SELECT * FROM ResultadoPorStatus

    UNION ALL

    SELECT * FROM ResultadoTotal)

     

    SELECT * FROM ResultadoConsolidado

    segunda-feira, 12 de janeiro de 2009 22:44
  • Adicionalmente, recomendo a leitura de um artigo meu:

     

    Transformando Linhas em Colunas com o SQL Server 2005
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!178.entry

     

    [ ]s,

     

    Gustavo Maia Aguiar

    http://gustavomaiaaguiar.spaces.live.com

     

    segunda-feira, 12 de janeiro de 2009 22:44

Todas as Respostas

  • Pldylan,

     

    Não consegui entender exatamente o que você deseja?

     

    segunda-feira, 12 de janeiro de 2009 16:15
  • Junior,

     

    Tenho que montar a seguinte consulta, ex:

     

    Code Snippet

    Status Dia 1 Dia 2 Dia 3 Dia 4 Dia 5 Dia 6 Dia 7 Dia 8 Dia 9
    Tentativas 0 0 0 0 0 0 0 572 639
    Contato Efetivo 0 0 0 0 0 0 0 372 361
    teste 0 0 0 0 0 0 0 944 1000
    % Total 0 0 0 0 0 0 0 0.6503 0.5649

     

     

    O select deve retorna por dia o total de cada status e realizar o calculo de porcetagem, que é o total de Efetivo / Tentativas, montei o select acima, mas ele não esta realizando o calculo.

     

     

    segunda-feira, 12 de janeiro de 2009 17:36
  • Olá.

     

    Não é mais fácil criar uma função para retornar esses dados? Assim você pode utilizar em outras querys.

     

    Abs.

     

    segunda-feira, 12 de janeiro de 2009 18:55
  • Boa Noite,

     

    Sinceramente acho que isso não é trabalho para a SQL. A SQL é muito poderosa, mas emitir um relatório desse nível não parece ser algo muito vantajoso. A SQL não dispõe de operadores preparados para tal. Embora seja possível, será difícil de fazer, de manter e possivelmente pouco performático.

     

    Considere utilizar o Analysis Services em conjunto como o SSIS para montar um DW, ou se preferir procure o relatório CROSS TAB do Reporting Services. São soluções mais interessantes que a SQL pura.

     

    Se desejar, segue um esboço de como ficaria em SQL (2005 e superiores)

     

    Code Snippet

    declare @o table (ocorrencia varchar(20), data smalldatetime)

    insert into @o values ('Tentativas','20090101')

    insert into @o values ('Tentativas','20090103')

    insert into @o values ('Tentativas','20090104')

    insert into @o values ('Tentativas','20090104')

    insert into @o values ('Tentativas','20090105')

    insert into @o values ('Contato Efetivo','20090101')

    insert into @o values ('Contato Efetivo','20090101')

    insert into @o values ('Contato Efetivo','20090101')

    insert into @o values ('Contato Efetivo','20090102')

    insert into @o values ('Contato Efetivo','20090102')

    insert into @o values ('Contato Efetivo','20090103')

    insert into @o values ('Contato Efetivo','20090104')

    insert into @o values ('Contato Efetivo','20090104')

    insert into @o values ('Contato Efetivo','20090104')

    insert into @o values ('Contato Efetivo','20090104')

    insert into @o values ('Contato Efetivo','20090105')

    insert into @o values ('Contato Efetivo','20090105')

    insert into @o values ('Contato Efetivo','20090106')

    insert into @o values ('Contato Efetivo','20090107')

    insert into @o values ('Contato Efetivo','20090108')

    insert into @o values ('Contato Efetivo','20090109')

    insert into @o values ('Contato Efetivo','20090109')

    insert into @o values ('Contato Efetivo','20090109')

    insert into @o values ('Contato Efetivo','20090109')

    insert into @o values ('Testes','20090102')

    insert into @o values ('Testes','20090105')

    insert into @o values ('Testes','20090106')

    segunda-feira, 12 de janeiro de 2009 22:42
  •  

     

    -- Converte as datas do mês de janeiro para dias

    ;WITH Janeiro2009 AS (

    SELECT Ocorrencia, DAY(Data) As Dia

    FROM @o WHERE Data >= '20090101' AND Data < '20090201'),

    ResultadoPorStatus AS (

    SELECT Status,

    [0], [1], [2], [3], [4], [5], [6], [7], [8], [9]

    FROM

    (SELECT Ocorrencia As Status, Ocorrencia, Dia

    FROM Janeiro2009) AS ST

    PIVOT

    (

    COUNT(Ocorrencia)

    FOR Dia IN ([0], [1], [2], [3], [4], [5], [6], [7], [8], [9])

    ) AS PV),

    ResultadoTotal AS (

    SELECT 'Total' As Total,

    [0], [1], [2], [3], [4], [5], [6], [7], [8], [9]

    FROM

    (SELECT Ocorrencia, Dia

    FROM Janeiro2009) AS ST

    PIVOT

    (

    COUNT(Ocorrencia)

    FOR Dia IN ([0], [1], [2], [3], [4], [5], [6], [7], [8], [9])

    ) AS PV),

    ResultadoConsolidado AS (

    SELECT * FROM ResultadoPorStatus

    UNION ALL

    SELECT * FROM ResultadoTotal)

     

    SELECT * FROM ResultadoConsolidado

    segunda-feira, 12 de janeiro de 2009 22:44
  • Adicionalmente, recomendo a leitura de um artigo meu:

     

    Transformando Linhas em Colunas com o SQL Server 2005
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!178.entry

     

    [ ]s,

     

    Gustavo Maia Aguiar

    http://gustavomaiaaguiar.spaces.live.com

     

    segunda-feira, 12 de janeiro de 2009 22:44
  • Muito obriagado pela ajuda galera, muito bom o artigo Gustavo.

     

    valeu ....

     

    terça-feira, 13 de janeiro de 2009 13:08