calculo de porcentagem sobre um count

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
Robson Costa
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 155
Registrado em: Sex, 17 Out 2008 6:05 pm
Localização: Campo Grande - MS

Boa tarde,

Quero fazer um script que mostre o seguinte resultado:

Selecionar tudo

     COD   TOTAL   TOTAL2 TOTAL2/TOTAL
ou seja, TOTAL traz o total de ocorrências de um determinado COD, TOTAL2 é o total de ocorrências de uma característica no COD e TOTAL2/TOTAL seria a porcentagem. Exemplificando:

COD - código de um produto
TOTAL - a quantidade que tenho deste produto
TOTAL2 - a quantidade que tenho deste produto de uma determinada marca
TOTAL2/TOTAL - %
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Olá, pra poder ajudá-lo, ficaria mais simples se você postar a estrutura simplificada da tabela (somente colunas necessárias para ilustrar o problema), algumas linhas de dados de exemplo e o resultado esperado que você gostaria de obter para estes mesmos dados fornecidos por você.

Teria como postar essas informações por favor?
Robson Costa
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 155
Registrado em: Sex, 17 Out 2008 6:05 pm
Localização: Campo Grande - MS

Exemplo:

Selecionar tudo

COD         Quant          Marca
-------        --------        --------
  1              10               2
  1              10               3
  2              10               2
  1              20               2
Relatório (Marca = 2):

Selecionar tudo

COD       TOTAL           TOTAL2      TOTAL2/TOTAL
-----       --------           ----------     --------------------
  1            40                   30                     75
  2            10                   10                    100
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Fiquei com uma certa dúvida pois os dados da tabela não têm primary key. Coloquei um distinct pra chegar no resultado que você precisa, mas não sei se é bem isso... Distinct vai contra minha religião... :lol:

Selecionar tudo

SQL> create table t1 (cod, quant, marca) as
  2  select 1, 10, 2 from dual union all
  3  select 1, 10, 3 from dual union all
  4  select 2, 10, 2 from dual union all
  5  select 1, 20, 2 from dual;
 
Table created
SQL> SELECT DISTINCT *
  2    FROM (SELECT cod,
  3                 marca,
  4                 SUM(quant) over(PARTITION BY cod) total,
  5                 SUM(quant) over(PARTITION BY cod, marca) total2,
  6                 ROUND(SUM(quant) over(PARTITION BY cod, marca) / SUM(quant) over(PARTITION BY cod) * 100, 2) tota2_total
  7            FROM t1)
  8   WHERE marca = 2;
 
       COD      MARCA      TOTAL     TOTAL2 TOTA2_TOTAL
---------- ---------- ---------- ---------- -----------
         2          2         10         10         100
         1          2         40         30          75
Talvez o mais correto fosse agregar em 2 níveis (cod e cod+marca) e depois agregar de novo em duas colunas... mas deixa ver se isso atende, senão volto pra prancheta.
Robson Costa
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 155
Registrado em: Sex, 17 Out 2008 6:05 pm
Localização: Campo Grande - MS

Obrigado, funcionou.

Mas tenho um complicador: no primeiro sum não deveria contar os produtos cuja marca seja 3, por exemplo. Como ficaria?

Vou exemplificar:

Selecionar tudo

COD   QUANT  MARCA
---------------------------
 1          10             2
 1          10             3
 1          10             4
 2          10             2
Relatório: (marca = 2)

Selecionar tudo

COD   TOTAL    TOTAL2       %
------------------------------------
 1        20           10           50
 2        10           10           100
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Dá para colocar dentro do SUM() uma condição de case expression para somar apenas quando for diferente de 3:

Selecionar tudo

SELECT DISTINCT cod,
                marca,
                total,
                total2,
                ROUND(total2 / total * 100, 2) total2_total
  FROM (SELECT cod,
               marca,
               SUM(case when marca <> 3 then quant end) over(PARTITION BY cod) total,
               SUM(quant) over(PARTITION BY cod, marca) total2
          FROM t1)
 WHERE marca = 2;
Robson Costa
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 155
Registrado em: Sex, 17 Out 2008 6:05 pm
Localização: Campo Grande - MS

Valeu! Deu certo.
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 17 visitantes