7

Oracle Express で HR 従業員スキーマを使用し、特定の年に雇用された従業員を選択したいと考えました。

  SELECT hire_date, 
         COUNT(*)
    FROM employees empl
GROUP BY SUBSTR(hire_date, -4)
ORDER BY empl.hire_date;

Hire_date 列の形式は「2011 年 1 月 1 日」なので、最後の 4 文字を抽出してグループ化したいと思います。

問題は、以下のエラーが発生していることです

ORA-00979: not a GROUP BY expression
00979. 00000 -  "not a GROUP BY expression"
*Cause:    
*Action:
Error at Line: 1 Column: 7

これは不可能ですか?

4

4 に答える 4

9

最後の 4 桁のみでグループ化hire_dateする場合は、すべてを選択できません。2 つの行があるとどうなるか考えてみてください。

hire_date
=========
01/01/2001
02/02/2001

それらをグループ化したときに生成される単一の行では、何をすべきでしょhire_dateか?

選択されたすべての列は、group-by 列または集計列である必要があります。つまり、次のことを試してください。

select substr(hire_date,-4), count(*)
from employees
group by substr(hire_date,-4)
order by empl.hire_date;

行ごとの関数はスケーリングが苦手なことで有名です。年を多く処理したい場合は、それを独自の列に分割することを検討する必要があります。これにより、パフォーマンスが大幅に向上する可能性がありますが、推測しないで測定してください。

そして、他の人がコメントで述べたように、substrそれはロケールに依存する可能性があるため、おそらく最良の解決策ではありません(たとえば、日付がフォーマットされている可能性があるためYYYY-MM-DDsubstring.

のようなものを使用する方が良い場合to_char(hire_date,'YYYY')extract (year from hire_date)、より堅牢にする必要がある場合があります。

于 2011-05-26T07:43:22.977 に答える
1

グループの従業員が雇用された年までに使用したい場合

select to_char(hiredate,'yyyy'),count(*) 
from employee
group by to_char(hiredate,'yyyy')
于 2011-05-26T07:46:04.760 に答える
0

クエリの一部では、GROUP BY条件または集計関数 (MIN, MAX, AVGなど)のみを使用できます。これは機能します:SELECTGROUP BY

select substr(hire_date,-4), count(*)
from employees empl
group by substr(hire_date,-4)
order by substr(hire_date,-4);
于 2011-05-26T07:41:45.440 に答える