none
Ajuda: simplificar query RRS feed

  • Pergunta

  • Olá a todos, boa noite.

     

    Sou novo aqui no fórum e desde já agradeço qualquer ajuda.

     

    Estou com dificuldades em 2 queries. A primeira funciona, mas creio que está um pouco confusa. Tentei de todas as formas simplificá-la, mas sem sucesso. É uma tabela de votação / avaliação de resenhas. Minha intenção é trazer como resultado os valores da colubas cod e resposta, incluindo o cálculo da porcentagem da votação e o total de votos.

     

    Code Snippet
    SELECT     cod, resposta, CAST(SUM(votos) * 100 / CAST
                              ((SELECT     SUM(votos) AS Expr1
                                  FROM         resenhas_cotacao
                                  WHERE     (cod_resenha = '123')) AS INT) AS NUMERIC(10, 2)) AS percVotos,
                              (SELECT     SUM(votos) AS Expr1
                                FROM          resenhas_cotacao
                                WHERE      (cod_resenha = '123')) AS totalVotos
    FROM         (SELECT     cod, resposta, votos, cod_resenha
                           FROM          resenhas_cotacao) AS A
    WHERE     (cod_resenha = '123')
    GROUP BY cod, resposta
    ORDER BY cod DESC

     

     

     

    RESULTADO DA QUERY

     

    Code Snippet
    cod   | resposta  | percVotos | totalVotos
    -------------------------------------------------------------
    12345 | Excelente | 3.03      | 120
    12346 | Ótimo     | 63.64     | 120
    12347 | Bom       | 24.24     | 120
    12348 | Regular   | 6.06      | 120
    12349 | Fraco     | 3.03      | 120

     

     

    Com a outra estou apanhando um pouco mais. Preciso extrair de uma tabela de notícias as 20 palavras-chave mais usadas nos últimos 60 dias, ordenar pela palavra e converter em porcentagem as incidências de cada palavra da lista.

     

    Estou utilizando a seguinte query:

     

    Code Snippet

    SELECT     chave, chaveQTD
    FROM         (SELECT     TOP (20) chave, COUNT(chave) AS chaveQTD
                           FROM          (SELECT     chave
                                                   FROM          noticias
                                                   WHERE      (data_ins > DATEADD(day, - 60, GETDATE())) AND (chave <> '')) AS A
                           GROUP BY chave
                           ORDER BY chaveQTD DESC) AS output
    ORDER BY chave

     

     

    Consigo listar e ordenar da forma que preciso, mas não consegui fazer o cálculo da porcentagem.

     

    Muito obrigado pela ajuda!

    quarta-feira, 21 de janeiro de 2009 04:14

Respostas

  • Bom Dia,

     

    Tente fazer dessa forma:

     

    Code Snippet

    declare @totalvotos numeric(10,2)

    set @totalvotos = (SELECT SUM(votos) FROM resenhas_cotacao WHERE (cod_resenha = '123'))

     

    SELECT cod, resposta, (SUM(votos) * 100) / @totalVotos as percVotos,

    @totalVotos AS totalVotos FROM resenhas_cotacao

    WHERE (cod_resenha = '123')

    GROUP BY cod, resposta

    ORDER BY cod DESC

     

    [ ]s,

     

    Gustavo Maia Aguiar

    http://gustavomaiaaguiar.spaces.live.com

     

    quarta-feira, 21 de janeiro de 2009 10:05

Todas as Respostas

  • CDechen,

     

    Você deseja melhorar a organização e estrutura das querys?

    quarta-feira, 21 de janeiro de 2009 10:00
  • Bom Dia,

     

    Tente fazer dessa forma:

     

    Code Snippet

    declare @totalvotos numeric(10,2)

    set @totalvotos = (SELECT SUM(votos) FROM resenhas_cotacao WHERE (cod_resenha = '123'))

     

    SELECT cod, resposta, (SUM(votos) * 100) / @totalVotos as percVotos,

    @totalVotos AS totalVotos FROM resenhas_cotacao

    WHERE (cod_resenha = '123')

    GROUP BY cod, resposta

    ORDER BY cod DESC

     

    [ ]s,

     

    Gustavo Maia Aguiar

    http://gustavomaiaaguiar.spaces.live.com

     

    quarta-feira, 21 de janeiro de 2009 10:05
  • CDechen,

     

    Outra possibilidade sem utilizar o Group By, mas não sei se é exatamente isso que você esta precisando:

     

    Code Snippet

    declare @totalvotos numeric(10,2),

    @TotalVotosCalculado Numeric(10,2)

     

    SELECT @TotalVotos=(SUM(votos)), @TotalVotosCalculado=(Sum(Votos)*100)

    FROM resenhas_cotacao

    WHERE (cod_resenha = '123'))

     

    SELECT cod, resposta,

    (@TotalVotosCalculado / @totalVotos) as percVotos,

    @totalVotos AS totalVotos

    FROM resenhas_cotacao

    WHERE (cod_resenha = '123')

    ORDER BY cod DESC

     

     

    quarta-feira, 21 de janeiro de 2009 10:15
  • CDechen,

     

    A segunda query talvez essa possa ser a sua idéia, mas não posso garantir:

     

    Code Snippet

    Select Top 20 Chave, Count(Chave) As ChaveQTD from Noticias

    Where (data_ins > DATEADD(day, - 60, GETDATE()))

    AND (chave <> '')

    GROUP BY chave

    ORDER BY chaveQTD DESC, Chave Asc

     

     

    quarta-feira, 21 de janeiro de 2009 10:24
  • Olá Gustavo,

     

    Deu uma boa enxugada e funcionou perfeitamente. Muito obrigado pela ajuda!

     

    []'s

    quarta-feira, 21 de janeiro de 2009 17:05
  • Olá Junior,

     

    Obrigado pelo retorno.

     

    Dessa forma funcionou como na que usei inicialmente, invertendo o ordenamento da palavra-chave, como no exemplo abaixo:

     

    Code Snippet
    PALAVRA | QTD
    -----------------------
    AAA     | 2
    BBB     | 3
    CCC     | 2
    DDD     | 4
    EEE     | 5

     

     

    Estou precisando converter o valor / número de incidências em porcentagem:

     

    Code Snippet
    PALAVRA  | QTD | PERC
    -------------------------------------
    AAA      | 2   | 12.50
    BBB      | 3   | 18.75
    CCC      | 2   | 12.50
    DDD      | 4   | 25.00
    EEE      | 5   | 31.25

     

     

     

    Agradeço a ajuda! Essa está me deixando de cabelos em pé, rs.

     

    Abraços.

     

     Junior Galvão - MVP wrote:

    CDechen,

     

    A segunda query talvez essa possa ser a sua idéia, mas não posso garantir:

     

    Code Snippet

    Select Top 20 Chave, Count(Chave) As ChaveQTD from Noticias

    Where (data_ins > DATEADD(day, - 60, GETDATE()))

    AND (chave <> '')

    GROUP BY chave

    ORDER BY chaveQTD DESC, Chave Asc

     

     

    quarta-feira, 21 de janeiro de 2009 17:19
  • Olá CDechen,

     

    Que bom que as consultas lhe atenderam. Se puder classifique a resposta.

     

    [ ]s,

     

    Gustavo Maia Aguiar

    http://gustavomaiaaguiar.spaces.live.com

     

    quarta-feira, 21 de janeiro de 2009 17:30