Array
(
)

Ajuda com consulta SQL

Fernando Moraes
   - 18 mai 2010

Tenho duas tabelas 
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
 

Danilo
   - 18 mai 2010

Tente isso:
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

0
|
0

Emerson
   - 18 mai 2010

tente isso:
 
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)



0
|
0

Fernando Moraes
   - 22 mai 2010

Rapaz deu certo a instrução SQL do emerson
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...

0
|
0

Fernando Moraes
   - 22 mai 2010

Em relação a ajuda do 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_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+

0
|
0