web-dev-qa-db-ja.com

集計を含む式で集計関数を実行できないのに、その周りに新しい選択ステートメントを作成することで実行できるのはなぜですか?

なぜSQL Serverではこれができないのですか:

select  sum(count(id)) as 'count'
from    table

しかし、私はできる

select sum(x.count)
from
(
    select  count(id) as 'count'
    from    table   
) x

それらは本質的に同じものではありませんか?コードの最初のブロックが許可されない理由を理解するために、どうやってこれについて考えるつもりなのですか?

27
Michael A

この例のSUM()はノーオペレーションです-COUNT()のSUM()は、COUNT()と同じ意味です。そのため、クエリの例ではどちらも有用なことを行っていないようです。

ネストした集計は、2つの異なる集計を適用する場合にのみ意味があるようです-異なる列のセットでGROUP BYを意味します。 2つの異なる集計を指定するには、GROUPING SETS機能またはSUM()OVER機能を使用する必要があります。たぶん、あなたが誰かに達成したいことを説明すれば、その方法を示すことができます。

14
nvogel

問題の要点は、リレーションに適用される集計の集計などの概念がないことです。 集計 を参照してください。このような概念があると、定義に多くの穴が残り、GROUP BY句を表現できなくなります。内側の集約GROUP BY句の両方を上手!これは、HAVING句などの他の集計属性にも適用されます。

ただし、リレーションに適用される集計の結果は別のリレーションであり、この結果のリレーションは新しい集計演算子をサポートできます。これは、結果を外部SELECTに集約できる理由を説明しています。これにより、定義に曖昧さがなくなり、各SELECTには独自の個別のGROUP BY/HAVING句があります。

8
Remus Rusanu

簡単に言えば、集計関数は列に対して動作し、スカラー値を生成するため、結果に対して適用できません。スカラー値に対してselectステートメントを作成すると、transform人工列になります。これが、集計関数で再び使用できる理由です。

サンプルsum(count(id)) == count(id)では、ほとんどの場合、別の集計関数の結果に集計関数を適用しても意味がないことに注意してください。

1
Gerardo Lima

このSQLであなたの期待される結果を知りたい

select  sum(count(id)) as 'count'
from    table

count関数を使用すると、1つの結果(合計カウント)のみが返されます。だから、なぜあなたが1つだけの結果を合計したいのか尋ねてもいいですか?.

集計関数は、集計またはサブクエリを含む式に対して実行できないため、必ずエラーが発生します。

1
AKZap

SQLFiddle を使用して機能していますが、なぜ機能しないのかわかりません。しかし、なぜそれがあなたのために機能しないのか、なぜ代替が機能するのかについて説明しています...

あなたの例では、列名としてキーワードを使用していますが、常に機能するとは限りません。しかし、列がサブ式のみにある場合、クエリエンジンは名前を自由に破棄できます(実際には実際にそうなっています)。したがって、潜在的にキーWordと競合する可能性があるという事実は無視されます。

編集:編集/コメントへの応答。いいえ、2つは同等ではありません。 RESULTは同等ですが、その結果に到達するプロセスはまったく似ていません。最初に機能するために、パーサーは、それが行うのが理にかなわないいくつかの作業を行います(行ごとにまたは単一の値に集約を適用します)、2番目の場合、集約テーブルに適用されます。テーブルが一時的な仮想テーブルであるという事実は、集約関数にとって重要ではありません。

1
jmoreno