2016-04-07 23 views
1

Bazı karşılaştırmalarla bazı sorun yaşıyorum. 3 tablolar var: Ben olabileceğinden daha fazla para harcanan tüm projeleri almak gerekirOracle - sayısal bir değerle toplamı() karşılaştırın

Table 1 Project 
Id - Budget 

Table 2 Member 
Id - Category - Hours 

Table 3 Costs 
Category - Salary/hour 

. para almak için ben bir sum() kullanın geçirdi ama bana bir Geçersiz tanımlayıcı hatası

select p.id, sum(m.hours*c.salary)as spent, max(p.budget) from member m 
join project p on p.id=m.id 
join costs c on m.category=c.category 
where spent>max(p.budget) 
group by p.id; 

Ben benzer bir şey bulamıyorum ben de o iki sütun karşılaştırmak bilmiyorum verir. Zaman ayırdığınız için teşekkür ederiz.

cevap

1

where tümcesinde spent diğer adlarını kullanamazsınız; sütun alt adları, bir alt sorgu kullanmıyorsanız yalnızca siparişte geçerlidir.

select p.id, sum(m.hours*c.salary) as spent, max(p.budget) 
from member m 
join project p on p.id=m.id 
join costs c on m.category=c.category 
group by p.id 
having sum(m.hours*c.salary) > max(p.budget); 

Ya bunu tekrarlamak istemiyorsanız, bir satır içi görünümünü kullanmak:: Ayrıca değil where yılında, bir having maddesi ile kontrol edilmelidir

select id, spent, budget 
from (
    select p.id, sum(m.hours*c.salary) as spent, max(p.budget) as budget 
    from member m 
    join project p on p.id=m.id 
    join costs c on m.category=c.category 
    group by p.id 
) 
where spent > budget; 

Gerçekten yok p.id zaten benzersiz olup olmadığını, bunun yerine grup tarafından fıkrada olduğu içerebilir, bütçe için max() agrega gerekir:

select id, spent, budget 
from (
    select p.id, sum(m.hours*c.salary) as spent, budget 
    from member m 
    join project p on p.id=m.id 
    join costs c on m.category=c.category 
    group by p.id, p.budget 
) 
where spent > budget; 
+0

çok teşekkürler! Mükemmel çalıştı :) –