Ajuda com consulta SQL
18/05/2010
0
BS_PESSOA
PES_ID pk not null
PES_NOME varchar(100) not null
PES_DATANASC datetime not null
PES_TIPOSANG char(2) not null
BS_DOACAO
DOA_ID pk not null
DOA_DATA datetime not null
DOA_QDTE numeric(6,3)
PES_ID int not null
preciso gerar um relatorio:
Nome da Pessoa
Tipo Sanguíneo
e Quantidade Doada
O relatorio deve conter apenas o maior doador de cada tipo sanguíneo pela ordem do maior pro menor da quantidade doada
meu select que nao deu certo:
select P.PES_NOME AS NOME,
P.PES_TIPOSANG AS TIPOSANGUE,
SUM(D.DOA_QDTE) AS QUANTIDADE
from BS_PESSOA P
inner join BS_DOACAO D on (P.PES_ID = D.PES_ID)
group by P.PES_NOME, P.PES_TIPOSANG
order by 2,3,1
não deu certo, em partes, pq está retornando várias pessoas do mesmo tipo sanguíneo, exemplo
Fulano -- A+ -- 3
Fulano -- A+ -- 7
Fulano -- O+ -- 2
Fulano -- O+ -- 5
E o certo seria retornar apenar o maior de cada tipo
e por fim esse meu outro select não funfa.
select P.PES_NOME AS NOME,
P.PES_TIPOSANG AS TIPOSANGUE,
SUM(select MAX(DOA_QDTE) from BS_DOACAO) AS QUANTIDADE
from BS_PESSOA P
inner join BS_DOACAO D on (P.PES_ID = D.PES_ID)
group by P.PES_NOME, P.PES_TIPOSANG
order by 2,3,1
Fernando Moraes
Posts
18/05/2010
Danilo
select tb1.* from
(select a.*,b.* from bs_doacao a left join bs_pessoa b on a.pes_id=b.pes_id) tb1
inner join
(select d.pes_tiposang ,max(doa_qtde) as qtd from bs_doacao c left join bs_pessoa d on (c.pes_id=d.pes_id) group by 1) tb2
on tb1.pes_tiposang=tb2.pes_tiposang and tb1.doa_qtde=tb2.qtd
[]s
18/05/2010
Emerson Nascimento
select
P.PES_NOME AS NOME,
P.PES_TIPOSANG AS TIPOSANGUE,
SUM(D.DOA_QTDE) AS QUANTIDADE
from
BS_PESSOA P
inner join
BS_DOACAO D on (P.PES_ID = D.PES_ID)
group by
P.PES_ID, P.PES_NOME, P.PES_TIPOSANG
having
SUM(D.DOA_QTDE) =
(select top 1 SUM(D2.DOA_QTDE) from BS_DOACAO D2
inner join BS_PESSOA P2 on (P2.PES_ID = D2.PES_ID)
where P2.PES_TIPOSANG = P.PES_TIPOSANG
group by D2.PES_ID
order by 1 desc)
22/05/2010
Fernando Moraes
select P.PES_NOME AS NOME, P.PES_TIPOSANG AS TIPOSANGUE, SUM(D.DOA_QDTE) AS QUANTIDADEfrom BS_PESSOA P inner join BS_DOACAO D on (P.PES_ID = D.PES_ID)group by P.PES_ID, P.PES_NOME, P.PES_TIPOSANGhaving SUM(D.DOA_QDTE) = (select top 1 SUM(D2.DOA_QDTE) from BS_DOACAO D2 inner join BS_PESSOA P2 on (P2.PES_ID = D2.PES_ID) where P2.PES_TIPOSANG = P.PES_TIPOSANG group by D2.PES_ID order by 1 desc)
obrigado pela ajuda...
22/05/2010
Fernando Moraes
select tb1.* from
(select a.*,b.* from bs_doacao a left join bs_pessoa b on a.pes_id=b.pes_id) tb1
inner join
(select d.pes_tiposang ,max(DOA_QDTE) as qtd from bs_doacao c left join bs_pessoa d on (c.pes_id=d.pes_id) group by 1) tb2
on tb1.pes_tiposang=tb2.pes_tiposang and tb1.DOA_QDTE=tb2.qtd
está me retornando um erro
Msg 8156, Level 16, State 1, Line 1Coluna 'PES_ID' especificada várias vezes para 'tb1'.
mas valeu pela ajudat+
Clique aqui para fazer login e interagir na Comunidade :)