Count(*)でエイリアスを使用してhaving句でそれを参照できないのはなぜだろうと思っていました。例えば:
select Store_id as StoreId, count(*) as _count
from StoreProduct
group by Store_id
having _count > 0
動作しません。しかし、_countを削除し、代わりにcount(*)を使用すると動作します。
ドキュメント参照 by CodeByMoonlight の answer to 最近の質問 を参照してください。
HAVING句はSELECTの前に評価されるため、サーバーはまだそのエイリアスを認識していません。
- 最初に、from句のすべてのテーブルの積が形成されます。
- 次に、where句が評価され、search_conditionを満たさない行が削除されます。
- 次に、group by句の列を使用して行がグループ化されます。
- 次に、having句のsearch_conditionを満たさないグループが削除されます。
- 次に、select句のターゲットリスト内の式が評価されます。
- Select句にdistinctキーワードが存在する場合、重複する行は削除されます。
- unionは、各副選択が評価された後に取得されます。
- 最後に、結果の行は、order by句で指定された列に従ってソートされます。
select
句は、order by
を除き、論理的に実行される最後の句です。 having
句はselectの前に発生するため、エイリアスはまだ使用できません。
これを行うことをお勧めするのではなく、本当にエイリアスを使用したい場合は、インラインビューを使用してエイリアスを使用可能にすることができます。
select StoreId, _count
from (select Store_id as StoreId, count(*) as _count
from StoreProduct
group by Store_id) T
where _count > 0
または、SQL Server 2005以降では、CTE:
; with T as (select Store_id as StoreId, count(*) as _count
from StoreProduct
group by Store_id)
select StoreId, _count
from T
where _count > 0
Select句でcountのエイリアスを使用できますが、havingステートメントでは使用できないため、これは機能します
select Store_id as StoreId, count(*) as _count
from StoreProduct
group by Store_id
having count(*) > 0
フィールド名のエイリアスは、結果の列に名前を付けるためだけのものであり、クエリ内で使用することはできません。これも好きではありません:
_select Store_id as Asdf
from StoreProduct
where Asdf = 42
_
ただし、両方の場所でcount(*)
を安全に使用でき、データベースはそれが同じ値であることを認識するため、2回計算されません。
私の貢献は次のとおりです(ここに投稿されたコードに基づく)。
select * from (
SELECT Store_id as StoreId, Count(*) as StoreCount
FROM StoreProduct
group by Store_id
) data
where data.StoreCount > 0
Hive 0.11.0以降では、Hive.groupby.orderby.position.aliasがtrueに設定されている場合、位置によって列を指定できます。
set Hive.groupby.orderby.position.alias=true;
select Store_id as StoreId, count(*) as _count
from StoreProduct
group by 1
クエリの目的がわかりません。投稿したクエリのコンテキストを考えると、存在しないアイテムがあるため、条件は必要ありません。 e。カウント0、クエリの結果になることはありません...
SQLで集計にエイリアスを使用できますが、結果ヘッダーにエイリアスを表示するだけです。ただし、集約関数を使用して条件を設定する場合は、名前ではなく関数を評価するため、集約を使用する必要があります。