1

私は以下の例を持っています:

SELECT name, age, location, SUM(pay)
FROM employee
GROUP BY location

これは予想通り、エラーになります。

ORA-00979: not a GROUP BY expression

どうすればこれを回避できますか?1つまたは2つの列でグループ化する必要がありますが、GROUP BY句で使用されていない場合でも、すべての列を返す必要があります。サブクエリを調べて回避しましたが、これまでのところうまくいきませんでした。

4

3 に答える 3

2

分析関数を使用できます。

SELECT name
, age
, location
, pay
, SUM(pay) over (partition by location order by location ) total
    FROM employee

したがって、グループ化で使用されていない場合でも、すべての行を返すことができます。

于 2013-03-22T12:24:26.650 に答える
1

それで、あなたは場所ごとの総賃金を知りたい、そしてあなたは各場所の従業員の名前と年齢を知りたいですか?どうですか:

SELECT e.NAME,
       e.AGE,
       e.LOCATION,
       t.TOTAL_LOCATION_PAY
  FROM EMPLOYEE e
  INNER JOIN (SELECT LOCATION,
                     SUM(PAY) AS TOTAL_LOCATION_PAY
                FROM EMPLOYEE
                GROUP BY LOCATION) t
    ON (t.LOCATION = e.LOCATION)

共有してお楽しみください。

于 2013-03-22T12:08:25.867 に答える
1

(グループb [http://docs.oracle.com/javadb/10.6.2.1/ref/rrefsqlj32654.html] group by句に含まれないすべての列に集計関数が必要です。グループ化する場合は、次のことを意味します。グループごとに1つの行が必要です。句の列の個別の値が最終結果セットに表示されます。

これは、Oracleが、groupbyに含まれていない列の値のどれを取得するかを認識できないためです。このことを考慮:

A    X
B    X

Select col1, col2 from myTable group by col2; -- incorrect
Select min(col1), col2 from myTable group by col2; -- correct

なぜ最初は間違っているのですか?OracleはX値に対してAとBのどちらを取得するかを認識できないため、指定する必要があります。つまり、MIN、MAXなどです。

結果セットのウィンドウの下で作業できるようにする、この名前付き分析関数の代替手段があります。

今、あなたが場所ごとに総従業員の支払いをしたいなら、そしてあなたがこれを望むかもしれないすべての従業員。

SELECT name, age, location, SUM(pay) OVER(PARTITION BY location)
FROM employee

テーブルを1回だけクエリするので、これは@BobJarvisクエリよりも優れていると思います。私が間違っている場合は訂正してください。彼には従業員と従業員もいます。打ち間違え?

于 2013-03-22T12:32:48.213 に答える