Jump to content

SELECT ... COUNT()


JLDR
 Share

Recommended Posts

Boas pessoal.

Estou completamente a passar-me da cabeça com algo que me parece simples, mas para o qual não encontro resposta.

Imaginem duas tabelas: Socios e Donativos

Socios(id_socio, nome)

Donativos(id_socio, quantia)

O que pretendo é fazer uma query que me devolva: o id_socio, o nome do sócio e o respectivo número de vezes que ele fez donativos.

Deveria ser:

SELECT s.id_socio, s.nome, COUNT(d.id_socio) AS total_donativos 
FROM donativos d INNER JOIN socios s ON donativos.id_socio = socios.id_socio

Estou a usar uma base de dados SQL Server CE.

Sempre que tento executar essa query o sistema devolve-me um erro:

"In aggregate and grouping expressions, the SELECT clause can contain only aggregates and grouping expressions."

Já deixar apenas o COUNT logo após o SELECT (sem qualquer outro campo a pesquisar) e a query funciona.

É muito estranho porque deveria deixar "misturar" o COUNT com outras colunas na pesquisa, mas na prática não me deixa fazer isso.

Onde é que estou a errar?

O que eu quero é saber:

socio 1 - x donativos

socio 2 - y donativos, etc. etc.

<p style="text-align: center">Visita o site em <a class="bbc_url" href="http://www.sys4soft.com" rel="nofollow external" title="Link Externo">www.sys4soft.com</a> e subscreve o canal do YouTube.</p>

<p style="text-align: center"><span style="font-size: 12px;">"Mais importante que saber muito é saber aplicar o pouco que se sabe."</span></p>

Link to comment
Share on other sites

Realmente esqueci-me de mencionar o GROUP BY, mas o facto é que, se coloco:

SELECT s.id_socio, COUNT(d.id_socio) AS total_donativos
FROM donativos d INNER JOIN socios s ON donativos.id_socio = socios.id_socio
GROUP BY id_socio

Assim funciona, mas apenas me devolve como resultado o id_socio e o total_donativos.

Mas se eu adicionar à query o item s.nome:

SELECT s.id_socio, s.nome, COUNT(d.id_socio) AS total_donativos
FROM donativos d INNER JOIN socios s ON donativos.id_socio = socios.id_socio
GROUP BY id_socio

Dá-me o tal erro que referi anteriormente...  :down:

Estou confuso.

<p style="text-align: center">Visita o site em <a class="bbc_url" href="http://www.sys4soft.com" rel="nofollow external" title="Link Externo">www.sys4soft.com</a> e subscreve o canal do YouTube.</p>

<p style="text-align: center"><span style="font-size: 12px;">"Mais importante que saber muito é saber aplicar o pouco que se sabe."</span></p>

Link to comment
Share on other sites

OK, já descobri onde estava a falha.

em GROUP BY tenho que adicionar também o s.nome.

Desta forma tem que ficar algo do género:

SELECT s.id_socio, s.nome, COUNT(d.id_socio) AS total_donativos
FROM donativos d INNER JOIN socios s ON donativos.id_socio = socios.id_socio
GROUP BY s.id_socio, s.nome

Obrigado pela dica.

<p style="text-align: center">Visita o site em <a class="bbc_url" href="http://www.sys4soft.com" rel="nofollow external" title="Link Externo">www.sys4soft.com</a> e subscreve o canal do YouTube.</p>

<p style="text-align: center"><span style="font-size: 12px;">"Mais importante que saber muito é saber aplicar o pouco que se sabe."</span></p>

Link to comment
Share on other sites

2 maneiras.. ate existe mais mas...

SELECT s.id_socio, s.nome, COUNT(1) AS total_donativos 
FROM donativos d 
INNER JOIN socios s ON donativos.id_socio = socios.id_socio
GROUP BY s.id_socio, s.nome

SELECT s.id_socio, s.nome,Tab.Qt total_donativos , Tab.NaoSeiSeTensEsteCampo
FROM socios S
CROSS APPLY
(
SELECT COUNT(1) QT, SUM(ValorDonativo) NaoSeiSeTensEsteCampo
FROM Donativos D
WHERE d.id_socio = s.id_socio
) Tab

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.