• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

6 mensagens neste tópico

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)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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 [[]]

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

De qq modo ja está solucionado o problema :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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 ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora