4

私は自分がやりたいことを説明しようとしてこの奇妙な例を作りました(それはちょっとばかげていますが、私に耐えてください):

次の表を検討してください。

従業員
従業員テーブルデータ

既婚認定宗教は単なるブールフィールドです(Oracleの場合、タイプはNUMBER(1,0)です)。

次の給与カテゴリ内の、各hire_year、既婚、認定、および宗教の従業員の数を表示するSQLを考え出す必要があります。

  • A SALARY > 2000
  • B SALARY BETWEEN 1000 AND 2000
  • C SALARY < 1000

上記のデータセットに基づいて、これが私が得ることを期待しているものです:

期待される結果

これまでのところ、私は次のSQLしか思いつきませんでした。

SELECT
COUNT(CASE WHEN married = 1 THEN 1 END) as MARRIED,
COUNT(CASE WHEN certified = 1 THEN 1 END) as certified,
COUNT(CASE WHEN religious = 1 THEN 1 END) as religious,
hire_year
FROM employees
GROUP BY hire_year;

このSQLを実行した結果は次のとおりです。

実結果

これはほとんど私が必要としていることですが、給与の範囲に基づいて、これらのカウンターをさらにグループに分割する必要もあります。

SQL式に基づいてグループをバケットに分割する分析関数が役立つと思いますが、どれが役立つかわかりませんNTILEを試してみましたが、SQL式(など)ではなく、パラメーターとして正の定数が必要ですSALARY BETWEEN X and Y

4

1 に答える 1

7

いいえ、分析関数は必要ありません。とにかく、集計関数と同じクエリに含めるのは困難です。

ステートメントをもう一度探しているcase場合は、それをGROUPBYに入れる必要があります。

select hire_year
     , sum(married) as married
     , sum(certified) as certified
     , sum(religious) as religious
     , case when salary > 2000 then 'A'
            when salary >= 1000 then 'B'
            else 'C' end as salary_class
  from employees
 group by hire_year
     , case when salary > 2000 then 'A'
            when salary >= 1000 then 'B'
            else 'C' end

あなたcount(case when...)をに変更したことに注意してくださいsum()。これは、ブール1/0を使用しているため、これは同じように機能しますが、はるかにクリーンです。

同じ理由で、私はbetweenあなたの給与計算であなたを無視しました。給与が2000を超えているかのように、特に必要はありません。最初のCASEはすでに実行されています。

于 2012-09-08T15:02:30.290 に答える