2013-04-01 31 views
16

Ten problem został już omówiony wcześniej, ale żadna z odpowiedzi nie rozwiązuje mojego konkretnego problemu, ponieważ mam do czynienia z różnymi klauzulami, w których wewnętrzne i zewnętrzne wybiera. Ta kwerenda została wykonana poprawnie w Sybase, ale podaje błąd w tytule tego wpisu po uruchomieniu pod SQL Server. Zapytanie jest skomplikowana, ale ogólny zarys zapytania jest:SQL Server "nie może wykonać funkcji agregującej dla wyrażenia zawierającego agregację lub podkwerendę", ale Sybase może

select sum (t.graduates - 
    (select sum (t1.graduates) 
     from table as t1 
     where t1.id = t.id and t1.group_code not in ('total', 'others'))) 
from table as t 
where t.group_code = 'total' 

Poniżej opisano sytuację staram się rozwiązać:

  • wszystkie kody grupowe stanowią ras z wyjątkiem „total” i ' Kod
  • grupa «całkowita inni» reprezentuje całkowitą absolwentów wszystkich ras
  • jednak, multi-race brakuje, więc liczy się rasa absolwenci mogą nie sumować się do całkowitej absolwenta liczy
  • te brakujące dane należy obliczyć:

Czy istnieje sposób przepisania tego przy użyciu wyprowadzonych tabel lub sprzężeń w celu uzyskania tych samych wyników?

Aktualizacja: Stworzyłem sample data and 3 solutions to my specific problem (2 pod wpływem sgeddes). Dodałem, że dodałem skorelowane podkwerendy do wyprowadzonej tabeli w klauzuli FROM. Dzięki za pomoc!

+0

Jakie są semantyka powinna być? Masz cztery '(' ale tylko dwa ')'. –

+0

Czy możesz przeliterować swoje zadanie, podać przykładowe dane i oczekiwany wynik. Dodaj także znacznik 'sql-server' do swojego postu. –

+1

Dodano semantykę, opis problemu, a także dane i rozwiązania na żądanie. – PillowMetal

Odpowiedz

27

Jedną z opcji jest, aby umieścić podzapytania w LEFT JOIN:

select sum (t.graduates) - t1.summedGraduates 
from table as t 
    left join 
    ( 
     select sum (graduates) summedGraduates, id 
     from table 
     where group_code not in ('total', 'others') 
     group by id 
    ) t1 on t.id = t1.id 
where t.group_code = 'total' 
group by t1.summedGraduates 

Być może lepszym rozwiązaniem byłoby wykorzystanie SUM z CASE:

select sum(case when group_code = 'total' then graduates end) - 
    sum(case when group_code not in ('total','others') then graduates end) 
from yourtable 

SQL Fiddle Demo with both

+0

I, magicznie, problem rozwiązuje ... GRUPA BY, więc jest to agregat. ;) –

Powiązane problemy