1. ホーム
  2. sql

[解決済み】SQL Serverは「集約関数やサブクエリを含む式に対して集約関数を実行できない」が、Sybaseはできる。

2022-01-25 05:10:36

質問

この問題は以前にも議論されたことがありますが、どの回答も私の具体的な問題を扱っていません。 このクエリは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'

以下は、私が解決しようとしている状況を記述したものです。

  • グループコードは、「合計」と「その他」を除き、すべて人種を表しています。
  • グループコード「total」は全人種の卒業生の合計を表します。
  • ただし、Multi-raceがないため、人種別卒業生数の合計が総卒業生数に一致しない場合があります。
  • この欠落したデータを計算する必要があります。

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

更新してください。 私が作成した サンプルデータと、具体的な問題に対する3つの解決策 (2つはsgeddesさんの影響)。私が追加したものは、FROM句で相関サブクエリを派生テーブルに移動させるというものです。助けてくれてありがとうございます。

解決方法は?

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 

おそらく、より良いオプションは SUM と共に 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デモ(両方あり