web-dev-qa-db-ja.com

SQL Serverは「集計またはサブクエリを含む式で集計関数を実行できません」が、Sybaseは

この問題については以前に説明しましたが、内側の選択と外側の選択で異なるwhere句を扱っているため、特定の問題に対処する回答はありません。このクエリはSybaseで正常に実行されましたが、SQL Serverで実行されると、この投稿のタイトルにエラーが表示されます。クエリは複雑ですが、クエリの一般的な概要は次のとおりです。

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'

以下は、私が解決しようとしている状況を説明しています。

  • 「合計」と「その他」を除くすべてのグループコードはレースを表します
  • グループコード「合計」はすべてのレースの卒業生の合計を表します
  • ただし、複数のレースが欠落しているため、レースの卒業者数が合計の卒業者数に加算されない場合があります
  • この欠落データは計算が必要なものです

派生テーブルまたは結合を使用してこれを書き換えて同じ結果を得る方法はありますか?

更新:作成しました サンプルデータと特定の問題に対する3つのソリューション (2つはsgeddesの影響を受けています)。追加したのは、相関サブクエリをFROM句の派生テーブルに移動することです。助けてくれてありがとう!

25
PillowMetal

1つのオプションは、サブクエリを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 

おそらく、より良いオプションは、SUMCASEとともに使用することです。

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両方のデモ)

35
sgeddes