Select (duas linhas em uma)

Delphi

29/10/2007

alo a todos,

estou fazendo um select so que precisaria que duas linhas
gerasse uma unica, exemplo.

SELECT Matricula,CodMateria,Bimestre, Nota, Faltas FROM Notas
WHERE Matricula = ´107472´
AND AnoLetivo = ´2007´
AND SemLetivo = ´1´
ORDER BY ´CodMateria´, ´Bimestre´

Matricula CodMateria Bimestre Nota Faltas
107472----99192--------1-----------0---------2,5
107472----99192--------2-----------5---------2,5
107472----99193--------1-----------0---------0
107472----99193--------2-----------3---------0
107472----99194--------1-----------0---------0
107472----99194--------2-----------4---------0

o que preciso é:
Matricula CodMateria Bimestre Nota Faltas Bimestre Nota Faltas
107472----99192------1----------0------- 2,5 --- 2 -------- 5 --- 2,5
107472----99193------1----------0------- 0 ----- 2 -------- 3 --- 0
107472----99194------1----------0------- 0 ----- 2 -------- 4 --- 0

ou seja, não aparecer 2 registros mas sim uma com dados na frente com
Bimestre, Nota e Faltas.

agradeço
por enquanto


Kelly

Kelly

Curtidas 0

Respostas

Orc

Orc

29/10/2007

se der um GROUP BY no cod da materia num resolve ???


GOSTEI 0
Kelly

Kelly

29/10/2007

pelo menos o teste com group by que fiz nao funcionou nao.

no aguardo ainda...


GOSTEI 0
George_piaulino

George_piaulino

29/10/2007

Utile um select dentro de outro select

Ex.

Select matricula,
(select top 1 bimestre from nota n2 where n2.matricula = n1.matricula and bimestre = 1)
from n2 where ........

com esta dica, vc saberá o que fazer....

A função top 1 é do sql server, caso não seja sql sever o seu banco utilize a função correspondente do seu banco


abraços


GOSTEI 0
Marcosrocha

Marcosrocha

29/10/2007

Select dentro de select na maioria das vezes resolve o problema mas em grande parte dos casos tem baixo desempenho. A cláusula Group by agrupa dados que dão idênticos aos que mandou agrupar mas se houver apenas 1 dado distinto no resultado, o select acabará duplicando.
Tente, além do Group by, utilizar o distinct ´Select Distinct campos from Tabela´.


GOSTEI 0
Aasn

Aasn

29/10/2007

Olá mcblade,

a melhor saída para vc é usar select dentro de select, se vc tiver índices bem definidos, não terá tanto problema assim com desempenho.

[]´s
AASN


GOSTEI 0
Marcosrocha

Marcosrocha

29/10/2007

a melhor saída para vc é usar select dentro de select, se vc tiver índices bem definidos, não terá tanto problema assim com desempenho.

Por isso eu uso apenas Joins quando tenho certeza de que há ligação entre as duas tabelas e defino os índices conforme a necessidade. Mas no caso de kelly será impossível agrupar dados distintos (diferentes por exemplo bimestre 1 e 2) sem fazer select dentro de select. Além do mais, ficaria demorado se fosse colocar do jeito sugerido.
o que preciso é: Matricula CodMateria [color=red:88db6dbf12]Bimestre Nota Faltas[/color:88db6dbf12] [color=blue:88db6dbf12] .... Bimestre Nota Faltas[/color:88db6dbf12] 107472---- 99192---[color=red:88db6dbf12]---1---------- 0------- 2,5 [/color:88db6dbf12]---[color=blue:88db6dbf12] 2 -------- 5 --- 2,5 [/color:88db6dbf12] 107472---- 99193---[color=red:88db6dbf12]---1---------- 0------- 0 ----- [/color:88db6dbf12][color=blue:88db6dbf12]2 -------- 3 --- 0 [/color:88db6dbf12] 107472---- 99194---[color=red:88db6dbf12]---1---------- 0------- 0 ----- [/color:88db6dbf12][color=blue:88db6dbf12]2--------- 4 --- 0[/color:88db6dbf12]

Esse select é possível, mas seria muito demorado.


GOSTEI 0
Kelly

Kelly

29/10/2007

pessoal cheguei a este resultado, mas não sei se
tem a melhor performance.


Select Notas.Matricula,CodMateria, Disciplina.DescrDiscipl, Bimestre as Bim1,Nota as Nota1, Faltas as Faltas1,
(select top 1 Bimestre from notas n2 where n2.matricula = Notas.matricula and bimestre = ´2´ and n2.CodMateria = Notas.CodMateria) as Bim2,
(select top 1 Nota from notas n2 where n2.matricula = Notas.matricula and bimestre = ´2´ and n2.CodMateria = Notas.CodMateria) ASNotas2,
(select top 1 Faltas from notas n2 where n2.matricula = Notas.matricula and bimestre = ´2´ and n2.CodMateria = Notas.CodMateria) as Faltas2
from notas
INNER JOIN Disciplina
ON Notas.CodMateria = Disciplina.CodDiscipl
WHERE Matricula = ´107472´
AND AnoLetivo = ´2007´
AND SemLetivo = ´1´
AND Bimestre = ´1´
ORDER BY ´CodMateria´

se alguem tiver outra ideia que melhore agradeço.


GOSTEI 0
Marcosrocha

Marcosrocha

29/10/2007

kelly, eu acredito que com os indices corretos você já ganhe um pouco de velocidade. Você pode também colocar essa SQL numa View para que o banco de dados sempre tenha montado o select, aí você só precisaria dar o select na View e, se necessário, usar o Where para buscar determinado aluno / ano letivo / matéria, etc...


GOSTEI 0
POSTAR