2016-12-19 18 views
0

で、私は次のように相談しようとしています:選択はPostgresの場合

 Managers | Clerks | Presidents | Analysts | Salesmans 
    -------------+---------+--------------+ -----------+------------- 

     3   4    1    2    4 

は、これまでのところ私はやって管理します。

select CASE WHEN lower(job)='salesman' THEN count(job) as "SALESMAN" 
WHEN lower(job)='clerk' THEN count(job) as "CLERK" 
WHEN lower(job)='manager' THEN count(job) as "MANAGER" 
WHEN lower(job)='analyst' THEN count(job) as "ANALYST" 
WHEN lower(job)='president' THEN count(job) as "PRESIDENT" 
from emp 
group by job; 

しかし、私はそれを実行するように見えることはできません、それをエラーが発生します:

ERROR: syntax error at or near "as"
LINE 1: ... CASE WHEN lower(job)='salesman' THEN count(job) as "SALESM...

別の列を作成するにはどうすれば選択を使用しますか?

+0

あなたがすることはできません。各列に対して別々の 'select case 'を作成する必要があります。またはクロス集計クエリを使用してください。http://stackoverflow.com/questions/3002499/postgresql-crosstab-query/11751905#11751905 – Lemjur

答えて

3

あなたは周りcase数を配置する必要があります。

select count(CASE WHEN lower(job)='salesman' THEN 1 END) as "SALESMAN" 
     count(CASE WHEN lower(job)='clerk' THEN 1 END) as "CLERK" 
     count(case WHEN lower(job)='manager' THEN 1 END) as "MANAGER" 
     count(case WHEN lower(job)='analyst' THEN 1 END) as "ANALYST" 
     count(case WHEN lower(job)='president' THEN 1 END) as "PRESIDENT" 
from emp; 

count()などの集計関数はNULL値を無視します。 CASE式は、条件に一致しない値のためにNULLを返します。したがって、これらはカウントされません。

またはfilter句を使用して単純:

select count(*) filter (where lower(job)='salesman') as "SALESMAN" 
     count(*) filter (where lower(job)='clerk') as "CLERK" 
     count(*) filter (where lower(job)='manager') as "MANAGER" 
     count(*) filter (where lower(job)='analyst') as "ANALYST" 
     count(*) filter (where lower(job)='president') as "PRESIDENT" 
from emp; 
+0

結果は1行にする必要があります。結果は5行になります。 –

+0

ありがとう!そのようにして動作しますが、 "THEN 1 END"で何をやっているのか説明できますか?どのように機能するのですか? –

+0

@Green_Sam:私の編集を参照してください –

関連する問題