2016-12-19 13 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...

如何在select中創建單獨的列?

+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()聚合函數忽略空值。對於與條件不匹配的值,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

我需要的結果只有一行,與您的結果我得到5行。 –

+0

謝謝!這樣它的工作原理,但你能解釋你在「THEN 1 END」中做什麼?它是如何工作的? –

+0

@Green_Sam:看我的編輯 –