2013-04-01 7 views
16

Questo problema è stato discusso in precedenza, ma nessuna delle risposte risolve il problema specifico perché ho a che fare con clausole diverse in cui l'interno e l'esterno seleziona. Questa query viene eseguita correttamente in Sybase, ma fornisce l'errore nel titolo di questo post quando eseguito in SQL Server. La query è complicato, ma il quadro generale della query è:SQL Server "non può eseguire una funzione di aggregazione su un'espressione che contiene un'aggregazione o una sottoquery", ma Sybase può

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' 

Il seguente descrive la situazione che sto cercando di risolvere:

  • tutti i codici di gruppo rappresentano le gare ad eccezione di 'totale' e ' altri
  • gruppo di codice 'totale' rappresenta i laureati totali di tutte le razze
  • tuttavia, multi-gara non è presente, in modo che i conteggi di laurea gara non può aggiungere fino al laureato totale conta
  • questo dato mancante è quello che deve essere calcolato

C'è comunque la possibilità di riscriverlo utilizzando tabelle o join derivati ​​per ottenere gli stessi risultati?

Aggiornamento: Ho creato sample data and 3 solutions to my specific problem (2 influenzato da sgeddes). Quello che ho aggiunto comporta lo spostamento della sottoquery correlata in una tabella derivata nella clausola FROM. Grazie per l'aiuto ragazzi!

+0

Quali sono la semantica suppone essere? Hai quattro '(' ma solo due ')'. –

+0

Puoi compitare il tuo compito, fornire dati di esempio e il risultato previsto. Inoltre, per favore aggiungi il tag 'sql-server' al tuo post. –

+1

Semantica aggiunta, descrizione del problema, nonché dati e soluzioni come richiesto. – PillowMetal

risposta

27

Una possibilità è quella di mettere la sottoquery in un 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 

Forse una scelta migliore sarebbe quella di utilizzare SUM con 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

E, magicamente, il problema è risolto da ... 'GROUP BY', in modo che sia un aggregato. ;) –

Problemi correlati