2
votes

la colonne n'existe pas d'erreur même lors de l'utilisation du mot-clé "as"

J'obtiens cette erreur:

    date    |         errors         
------------+------------------------
 2016-07-17 |     2.2626862468027260
 2016-07-19 | 0.78242171265427079381
 2016-07-24 | 0.78221415607985480944
 2016-07-05 | 0.77493816982687551525
 2016-07-06 | 0.76678716179209113813

même si j'ai vérifié le résultat avec select.

J'utilise le serveur postgresql, j'ai une table nommée log comme le suivant:

select 
    a.date, 
    (cast(a.count as decimal) * 100 / b.count) as errors 
from (
    select date(time) as date, count(status) from log
    where status!='200 OK'
    group by date
    order by date asc
) as a 
join (
    select date(time) as date, count(status) 
    from log
    group by date
    order by date asc
) as b on a.date=b.date
order by errors desc;

il y a beaucoup de lignes dans la base de données.

voici ma requête

select 
    a.date, 
    (cast(a.count as decimal) * 100 / b.count) as errors 
from (
    select date(time) as date, count(status) from log
    where status!='200 OK'
    group by date
    order by date asc
) as a 
join (
    select date(time) as date, count(status) 
    from log
    group by date
    order by date asc
) as b on a.date=b.date
where errors >= 1
order by errors desc;

mais quand j'essaye cette requête sans le 'where errors> = 1', j'ai obtenu le résultat attendu avec 2 colonnes une date nommée et une autre nommée erreurs

voici le résultat

Column |           Type           |                    Modifiers                     
--------+--------------------------+--------------------------------------------------
 path   | text                     | 
 ip     | inet                     | 
 method | text                     | 
 status | text                     | 
 time   | timestamp with time zone | default now()
 id     | integer                  | not null default nextval('log_id_seq'::regclass)

Résultat:

ERROR:  column "errors" does not exist  
LINE 11: where errors >= 1


1 commentaires

Vous ne pouvez pas utiliser d'alias de colonne dans la clause where associée au select . Vous pouvez répéter l'expression, utiliser une sous-requête, un CTE ou une jointure latérale.


3 Réponses :


1
votes

remplacez where errors> = 1 par (cast (a.count as decimal) * 100 / b.count)> = 1 car il n'y a pas de colonne appelée errors mais une colonne dérivée:

select *
  from (select a.date, (cast(a.count as decimal) * 100 / b.count) as errors
          from (select date(time) as date, count(status)
                  from log
                 where status != '200 OK'
                 group by date
                 order by date asc) as a
          join (select date(time) as date, count(status)
                 from log
                group by date
                order by date asc) as b
            on a.date = b.date) q
 where errors >= 1
 order by errors desc;

OU

Elle peut être utilisée comme ci-dessus comme ci-dessous:

select a.date, (cast(a.count as decimal) * 100 / b.count) as errors
  from (select date(time) as date, count(status)
          from log
         where status != '200 OK'
         group by date
         order by date asc) as a
  join (select date(time) as date, count(status)
          from log
         group by date
         order by date asc) as b
    on a.date = b.date
 where (cast(a.count as decimal) * 100 / b.count) >= 1
 order by errors desc; 


0 commentaires

0
votes

Votre requête serait plus simplement écrite comme suit:

select l.time::date as dte,
       100 * avg( (status <> '200 OK')::int) as error_rate
from (
    from log l
    group by dte
    having 100 * avg( (status <> '200 OK')::int) >= 1
    order by error_rate desc;

Vous pouvez utiliser des alias dans la clause ayant de nombreuses bases de données, mais pas Postgres.


3 commentaires

il y a une erreur de syntaxe, je crois.


sélectionnez l.time :: date comme dte, 100 * avg ((status <> '200 OK') :: int) comme error_rate du journal l group by dte ayant error_rate> = 1 order by error_rate desc J'ai essayé ceci mais il dit ce error_rate n'existe pas?


@OSEMATOUATI. . . Ma faute. Postgres est l'une des bases de données qui n'autorise pas de telles références.



0
votes

Remplacez

where (cast(a.count as decimal) * 100 / b.count) >= 1

par

where errors >= 1

Vous ne pouvez pas utiliser d'alias de colonne dans le même niveau de votre requête.


0 commentaires