Usuário com melhor resposta
Select Porcetagem Dias

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 SnippetSELECT '% 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 SnippetSELECT '% 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 Snippetcalculo %calculo dia 1 7 dia 2 4 dia 3 3 dia 4 2
Valeu pela ajuda..
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 Snippetdeclare
@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') -
-- Converte as datas do mês de janeiro para dias
;
WITH Janeiro2009 AS (SELECT
Ocorrencia, DAY(Data) As DiaFROM
@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 STPIVOT
(
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 STPIVOT
(
COUNT
(Ocorrencia)FOR
Dia IN ([0], [1], [2], [3], [4], [5], [6], [7], [8], [9]))
AS PV),ResultadoConsolidado
AS (SELECT
* FROM ResultadoPorStatusUNION ALL
SELECT
* FROM ResultadoTotal)SELECT
* FROM ResultadoConsolidado -
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
Todas as Respostas
-
-
Junior,
Tenho que montar a seguinte consulta, ex:
Code SnippetStatus 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.
-
-
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 Snippetdeclare
@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') -
-- Converte as datas do mês de janeiro para dias
;
WITH Janeiro2009 AS (SELECT
Ocorrencia, DAY(Data) As DiaFROM
@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 STPIVOT
(
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 STPIVOT
(
COUNT
(Ocorrencia)FOR
Dia IN ([0], [1], [2], [3], [4], [5], [6], [7], [8], [9]))
AS PV),ResultadoConsolidado
AS (SELECT
* FROM ResultadoPorStatusUNION ALL
SELECT
* FROM ResultadoTotal)SELECT
* FROM ResultadoConsolidado -
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
-