13

GROUP BY句は行をグループ化しますが、必ずしも結果を特定の順序で並べ替えるわけではありません。順序を変更するには、GROUPBY句の後に続くORDERBY句を使用します。ORDER BY句で使用される列は、通常のORDER BYの使用とは異なり、SELECTリストに表示される必要があります。[Oracle by Example、第4版、274ページ]

何故ですか?GROUP BYを使用すると、SELECT句の必須列に影響するのはなぜですか?

また、GROUP BYを使用しない場合:一部の列をORDER BYしたいのに、列のサブセットのみを選択するのはなぜですか?

4

7 に答える 7

7

引用の太字のテキストは正しくありません(多くの一般的なユースケースで当てはまるのはおそらく過度に単純化されていますが、要件として厳密には当てはまりません)。たとえば、このステートメントはAVG(val)、選択リストには含まれていませんが、問題なく実行されます。

WITH DATA AS (SELECT mod(LEVEL,3) grp, LEVEL val FROM dual CONNECT BY LEVEL < 100)
SELECT grp,MIN(val),MAX(val)
FROM DATA
GROUP BY grp
ORDER BY AVG(val)

ORDER BY句の式は、GROUPBYのコンテキストで評価できる必要があります。たとえばORDER BY val、上記の例ではval機能しません。これは、式には、グループ化によって生成された各行に対して個別の値がないためです。

2番目の質問に関しては、順序については気にするかもしれませんが、順序式の値については気にしないかもしれません。選択リストから不要な式を除外すると、サーバーからクライアントに実際に送信する必要のあるデータの量が減ります。

于 2012-08-29T18:56:14.840 に答える
7

実際、デイブ・コスタの例が示すように、この声明は完全には真実ではありません。

Oracleのドキュメントには、式を使用できると記載されていますが、式は選択リストの列に基づいている必要があります。

expr- exprは、exprの値に基づいて行を並べ替えます。式は、選択リストの列、またはFROM句の表、ビュー、またはマテリアライズド・ビューの列に基づいています。出典:Oracle®DatabaseSQL Language Reference 11g Release 2(11.2)E26088-012011年9月。ページ19-33

同じ作業ページ19-13および19-33から(PDFのページ1355および1365)

ここに画像の説明を入力してください

ここに画像の説明を入力してください

http://docs.oracle.com/cd/E11882_01/server.112/e26088/statements_10002.htm#SQLRF01702

http://docs.oracle.com/cd/E11882_01/server.112/e26088/statements_10002.htm#i2171079

于 2012-08-29T18:51:32.957 に答える
3

初め:

group byの実装は、元のfrom句(テーブルビューまたはいくつかの結合されたテーブル)とは構造が異なる新しい結果セットを作成するものです。その結果セットは、選択されたものによって定義されます。

すべてのSQLRDBMSにこの制限があるわけではありませんが、順序付けられるものは、グループ化されていない列(、など)の集計関数AVGSUMまたはグループ化された列の1つ、または複数の列で機能する必要があります。これはグループ化操作の結果の論理要件であるため、これらの結果(2つの列の追加など)。

2番:

あなたは注文のためにその列だけを気にするからです。たとえば、売り上げを上げずに売れ行きの良いシングルのリストがあるとします(NYTベストセラーはデータの詳細を秘密にしていますが、ランク付けされたリストはあります)。もちろん、その列を選択して使用しないことで、これを回避できます。

于 2012-08-29T18:59:38.060 に答える
2

データは、ORDERBYでソートされる前に集約されます。

他の列(group byリストまたは集計関数にない)で並べ替えようとすると、どのような値が使用されますか?注文に使用する単一の値はありません。

値の組み合わせでソートできると思います。だからあなたは言うことができます:

order by a+b

aとbがbyのグループに含まれている場合。SELECTに記載されていない列を導入することはできません。ただし、SELECTに記載されていない集計関数は使用できると思います。

于 2012-08-29T18:54:12.067 に答える
1

サンプルテーブル

sample.grades
Name   Grade    Score
Adam   A        95
Bob    A        97
Charlie C       75

GROUPBYを使用した最初のクエリ

Select grade, count(Grade) from sample.grades GROUP BY Grade

出力

Grade Count
A     2
C     1

順序を使用した2番目のクエリ

select Name, score from sample grades order by score

出力

Bob    A        97
Adam   A        95
Charlie C       75

GROUPBYと順序付けを使用した3番目のクエリ

Select grade, count(Grade) from sample.grades GROUP BY Grade desc

出力

Grade Count
A     2
C     1

Countのようなものを使い始めたら、groupbyが必要です。一緒に使用することもできますが、例が明確に示されているように、用途は大きく異なります。

質問に答えるために、なぜgroup byが選択セクションの項目に影響を与えるのですか?それがgroupbyの目的であるためです。その列でグループ化しない場合、その列のカウントを行うことはできません。

2番目の質問、すべての列を選択せず​​に並べ替えるのはなぜですか?スコアで注文したいが、実際のグレードやスコアさえ気にしない場合

select name from sample.grades order by score

出力

Name
Bob
Adam
Charlie
于 2012-08-29T18:52:44.207 に答える
0

選択リストにリストされておらず、group by句に参加していない列による順序付けは、どの結果になると思いますか?いずれにせよ、SELECTリストの列に記載されていないすべての種類の並べ替えは省略されるため、Oracleの担当者は制限を正しく追加しました。

with c as (
select 1 id, 2 value from dual
union all
select 1 id, 3 value from dual
union all
select 2 id, 3 value from dual
)
select id
from c
group by id
order by count(*) desc
于 2012-08-29T18:52:12.673 に答える
0

ここに私の理解

「GROUPBY句は行をグループ化しますが、必ずしも結果を特定の順序で並べ替えるわけではありません。」

->並べ替えなしでGroupbyを使用できます

「順序を変更するには、GROUPBY句の後に続くORDERBY句を使用してください。」

->行は主キーを使用してデフォルトで選択されます。順序を追加する場合は、groupbyの後に追加する必要があります。

「ORDERBY句で使用される列は、通常のORDER BYの使用とは異なり、SELECTリストに表示される必要があります。」

于 2012-08-29T18:52:56.980 に答える