Pourquoi ne puis-je pas utiliser alias dans une colonne count (*) et la référencer dans une clause having?

je me demandais pourquoi je ne pouvais pas utiliser alias dans un count(*) et le référencer dans la clause avoir. Par exemple:

select Store_id as StoreId, count(*) as _count
    from StoreProduct
    group by Store_id
        having _count > 0

ne marcherait pas.. Mais cela fonctionne si je supprime _count et utilise count(*) à la place.

50
demandé sur André Pena 2010-01-15 03:45:00

8 réponses

voir le document référencé par CodeByMoonlight dans un réponse à votre question récente .

la clause ayant est évaluée avant la SELECT - de sorte que le serveur n'est pas encore au courant de cet alias.

  1. tout d'abord, le produit de toutes les tables de la clause de est formé.
  2. la où la clause est ensuite évaluée pour éliminer les lignes qui ne satisfont pas la condition search_condition.
  3. ensuite, les lignes sont groupées en utilisant les colonnes du groupe par clause.
  4. ensuite, les groupes qui ne satisfont pas la condition search_condition dans le ayant la clause est supprimée.
  5. ensuite, les expressions dans le sélectionnez clause liste d'objectifs sont évaluer.
  6. si le distinct mot-clé présent dans la clause select, doublonner les lignes sont maintenant éliminés.
  7. le union est pris après chaque sous-sélection est évaluée.
  8. enfin, les lignes résultantes sont triées selon les colonnes spécifié dans l'ordre par clause.
82
répondu martin clayton 2017-05-23 12:34:39

la clause select est la dernière clause à être exécutée logiquement, à l'exception de order by . La clause having arrive avant select, donc les alias ne sont pas encore disponibles.

si vous voulez vraiment utiliser un alias, non pas que je vous le recommande, une vue en ligne peut être utilisée pour rendre les alias disponibles:

select StoreId, _count
from (select Store_id as StoreId, count(*) as _count
    from StoreProduct
    group by Store_id) T
where _count > 0

Ou dans SQL Server 2005 et au-dessus, une expression de table commune:

; 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
10
répondu Shannon Severance 2010-01-15 00:52:12

vous pouvez utiliser l'alias pour compter dans la clause select, vous ne pouvez pas l'utiliser dans la déclaration ayant, donc cela fonctionnerait

select Store_id as StoreId, count(*) as _count
    from StoreProduct
    group by Store_id
        having count(*) > 0
3
répondu Glenn Slaven 2010-01-15 00:50:54

Vous pouvez utiliser l'alias pour les agrégats en SQL, mais c'est juste pour montrer l'alias dans les résultats des en-têtes. Mais lorsque vous souhaitez avoir un problème avec la fonction d'agrégation dans le de vous avoir encore besoin d'utiliser l'agrégation parce qu'il évalue la fonction et non pas le nom.

0
répondu Jose Chama 2010-01-15 00:52:08

les Alias pour les noms de champs sont uniquement pour nommer les colonnes dans le résultat, ils ne peuvent jamais être utilisés à l'intérieur de la requête. Vous ne pouvez pas faire cela non plus:

select Store_id as Asdf
from StoreProduct
where Asdf = 42

cependant, vous pouvez utiliser count(*) en toute sécurité dans les deux endroits, et la base de données reconnaîtra que c'est la même valeur, donc il ne sera pas calculé deux fois.

0
répondu Guffa 2010-01-15 00:55:26

dans la ruche 0.11.0 et les suivantes, les colonnes peuvent être spécifiées par la position si la ruche.groupby.orderby.position.alias est défini à true.

set hive.groupby.orderby.position.alias=true;
select Store_id as StoreId, count(*) as _count
from StoreProduct
group by 1

Je ne comprends pas le but de votre requête. Étant donné le contexte de la requête que vous avez posté, votre condition n'est pas nécessaire parce que les éléments qui n'existent pas, I. E. count 0, ne sera jamais un résultat d'une requête...

0
répondu rafaelvalle 2016-07-28 10:09:17

voici ma contribution (basée sur le code affiché ici):

select * from (
  SELECT Store_id as StoreId, Count(*) as StoreCount 
  FROM StoreProduct
  group by Store_id
  ) data
where data.StoreCount > 0
0
répondu New Dawg Learning Old Tricks 2017-05-17 00:38:22

probablement parce que c'est la façon dont sql définit les espaces de noms. prenons, par exemple:

  select a as b, b as a
    from table
   where b = '5'
order by a

à quoi font référence a et b? Les concepteurs ont juste choisi de faire l'alias n'apparaissent que sur le "dehors" de la requête.

-1
répondu Jimmy 2010-01-15 00:51:29