Jump to content
Sign in to follow this  
Bruno

Query "esquesita" de SQL

Recommended Posts

Bruno

Tenho uma tabela com as notas de uma cadeira de cada aluno... algo do tipo:

Nome | Nota
------------
Bruno | 15
Joana | 17
Miguel| 15

Agora se quisesse saber qts alunos tiveram cada nota bastava:

select nota, count(nome) from ... group by nota

Certo? (acho q estou a ver bem)

E isto daria algo do tipo

Nota | Nº
-----------
15   | 2
17   | 1

Mas... a query é suposto ser esquesita :oops: e portanto em vez de dar duas linhas devia dar era 2 colunas... isto é:

15 | 17
--------
2  |  1

Alguem sabe fazer isto? :P (se alguem me disser a ideia em SQL normal eu penso q depois safo-me :P )

Share this post


Link to post
Share on other sites
milks

Experimenta esta:

SELECT 
   SUM(IF(nota=1,1,0)) AS '1',
   SUM(IF(nota=2,1,0)) AS '2',
   SUM(IF(nota=3,1,0)) AS '3',
   SUM(IF(nota=4,1,0)) AS '4',
   SUM(IF(nota=5,1,0)) AS '5',
   SUM(IF(nota=6,1,0)) AS '6',
   SUM(IF(nota=7,1,0)) AS '7',
   SUM(IF(nota=8,1,0)) AS '8',
   SUM(IF(nota=9,1,0)) AS '9',
   SUM(IF(nota=10,1,0)) AS '10',
   SUM(IF(nota=11,1,0)) AS '11',
   SUM(IF(nota=12,1,0)) AS '12',
   SUM(IF(nota=13,1,0)) AS '13',
   SUM(IF(nota=14,1,0)) AS '14',
   SUM(IF(nota=15,1,0)) AS '15',
   SUM(IF(nota=16,1,0)) AS '16',
   SUM(IF(nota=17,1,0)) AS '17',
   SUM(IF(nota=18,1,0)) AS '18',
   SUM(IF(nota=19,1,0)) AS '19',
   SUM(IF(nota=20,1,0)) AS '20'
FROM notas;

É um pouco grande, e foi feita em MySQL 4.x.x, como no 5 já há stored procedures deve existir uma forma de fazer o mesmo mas mais simples.(mais aqui: http://www.futhark.ch/mysql/106.html e http://dev.mysql.com/tech-resources/articles/wizard/index.html )

Explicando o que a query faz:

Passa por todos os registos e se nota = x, soma 1 senão, soma 0.

Outra coisa interessante, se tivesses bastantes valores, por exemplo, se a nota fosse de 1 a 100, estar a escrever à mão dava trabalho :P , o melhor é por o MySQL a escrever por ti:

SELECT CONCAT(', SUM(IF(nota = ',nota,', 1,0)) AS `',nota,'`')
FROM notas
GROUP BY nota;

devolve

, SUM(IF(nota = 15, 1,0)) AS `15`
, SUM(IF(nota = 17, 1,0)) AS `17`

Depois era só "copy & paste" :P

O inconveniente deste metodo é que como só existem as notas 15 e 17, só estas é que são apresentadas, mas pode ser útil noutros casos e (para quem não leu o 2º link) achei por bem colocar aqui.

ps: já faz falta o syntax highlighting no forum :P

Share this post


Link to post
Share on other sites
Bruno

Obrigado pela resposta :P

Só irei testar no fds, depois darei feedback... e já agora estou a usar o MS SQL Server :P

Um abraço [[]]

Share this post


Link to post
Share on other sites
Bruno

Não funcionou... ele n curtiu o IF dentro do SUM/SELECT ;)

De qq modo ja está solucionado o problema :D

Share this post


Link to post
Share on other sites
milks

O que ele está a usar é o MSSQL, eu não tinha a certeza se o IF dava em MSSQL, sabia que podia usar CASE, mas ficava uma query ainda mais longa, em qualquer dos casos pelo que ele diz o problema já está resolvido ;)

Share this post


Link to post
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
Sign in to follow this  

×
×
  • 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.