it-swarm.com.de

SQL Server "kann keine Aggregatfunktion für einen Ausdruck ausführen, der ein Aggregat oder eine Unterabfrage enthält", Sybase jedoch

Dieses Problem wurde bereits erörtert, aber keine der Antworten befasst sich mit meinem spezifischen Problem, da es sich um unterschiedliche where-Klauseln in der inneren und äußeren Auswahl handelt. Diese Abfrage wurde einwandfrei unter Sybase ausgeführt, gibt jedoch den Fehler im Titel dieses Beitrags aus, wenn sie unter SQL Server ausgeführt wird. Die Abfrage ist kompliziert, aber die allgemeine Gliederung der Abfrage lautet:

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'

Im Folgenden wird die Situation beschrieben, die ich zu lösen versuche:

  • alle Gruppencodes stehen für Rennen mit Ausnahme von "total" und "others"
  • der Gruppencode 'total' repräsentiert die Gesamtzahl der Absolventen aller Rennen
  • da jedoch mehrere Rennen fehlen, addieren sich die Absolventenzahlen der Rennen möglicherweise nicht zu den Gesamtzahlen der Absolventen
  • diese fehlenden Daten müssen berechnet werden

Gibt es eine Möglichkeit, dies mit abgeleiteten Tabellen oder Joins neu zu schreiben, um die gleichen Ergebnisse zu erzielen?

Update: Ich habe Beispieldaten und 3 Lösungen für mein spezifisches Problem (2 beeinflusst von sgeddes) erstellt. Die eine, die ich hinzugefügt habe, beinhaltet das Verschieben der korrelierten Unterabfrage in eine abgeleitete Tabelle in der FROM-Klausel. Danke für die Hilfe Jungs!

25
PillowMetal

Eine Möglichkeit besteht darin, die Unterabfrage in ein 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 

Vielleicht wäre eine bessere Option, SUM mit CASE zu verwenden:

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 mit beiden

35
sgeddes