2013-04-01 31 views
2

我正在通過練習工作表提供問題和預期輸出。最後一個問題證明對我來說很難理解。任何人都可以請幫忙。初學者Oracle SQL計數函數多列

問題

創建一個查詢,顯示僱員總數和,即總的, 於2005年,2006年,2007年和2008年

預期輸出格式

僱用的員工人數
Total 2005 2006 2007 2008 
107 29 24 19 11 

以下是我嘗試用單獨的查詢得到的結果

TO_CHAR(hire_date,'YYYY') 
SELECT COUNT(employee_id) AS "Total" 
FROM employees; 

SELECT COUNT(employee_id) AS "2005" 
FROM employees 
WHERE TO_CHAR(hire_date,'YYYY') LIKE '2005' GROUP BY TO_CHAR(hire_date,'YYYY') ; 

SELECT COUNT(employee_id) AS "2006" 
FROM employees 
WHERE TO_CHAR(hire_date,'YYYY') LIKE '2006' GROUP BY TO_CHAR(hire_date,'YYYY') ; 

SELECT COUNT(employee_id) AS "2007" 
FROM employees 
WHERE TO_CHAR(hire_date,'YYYY') LIKE '2007' GROUP BY TO_CHAR(hire_date,'YYYY') ; 

SELECT COUNT(employee_id) AS "2008" 
FROM employees 
WHERE TO_CHAR(hire_date,'YYYY') LIKE '2008' GROUP BY TO_CHAR(hire_date,'YYYY') ; 

任何幫助產生的結果作爲一個查詢是非常感謝。

+0

像這樣的東西應該工作:'SELECT COUNT(*)AS numEmpls,TO_CHAR(聘用日期, 'YYYY')AS的某些地方FROM員工GROUP BY TO_CHAR(聘用日期, 'YYYY')' –

回答

1

您正在嘗試數據,這樣您就可以使用您現有的查詢,但加總的內部CASE表達:

SELECT COUNT(employee_id) AS "Total", 
    sum(case when TO_CHAR(hire_date,'YYYY') = '2005' then 1 else 0 end) "2005", 
    sum(case when TO_CHAR(hire_date,'YYYY') = '2006' then 1 else 0 end) "2006", 
    sum(case when TO_CHAR(hire_date,'YYYY') = '2007' then 1 else 0 end) "2007", 
    sum(case when TO_CHAR(hire_date,'YYYY') = '2008' then 1 else 0 end) "2008" 
FROM employees; 

根據您的Oracle版本,你也許可以使用PIVOT功能:

select * 
from 
(
    select count(*) over() Total, 
    TO_CHAR(hire_date,'YYYY') Year 
    from employees 
) 
pivot 
(
    count(Year) 
    for Year in ('2005', '2006', '2007', '2008') 
) 

Demo of both queries

+0

非常感謝你這是我正在尋找。 – knatz

+0

@ knatz歡迎您使用'PIVOT'添加一個版本,如果您使用的是Oracle 11g + – Taryn

2

爲了把這些列中,使用條件aggreagtaion:

select count(*) as Total, 
     sum(case when to_char(hire_date, 'yyyy') = '2005' then 1 else 0 end) as "2005", 
     sum(case when to_char(hire_date, 'yyyy') = '2006' then 1 else 0 end) as "2006", 
     sum(case when to_char(hire_date, 'yyyy') = '2007' then 1 else 0 end) as "2007", 
     sum(case when to_char(hire_date, 'yyyy') = '2008' then 1 else 0 end) as "2008" 
from employees 
where to_char(hire_date, 'yyyy') in ('2005', 2006', '2007', '2008') 
+0

謝謝你的幫助是有沒有任何優勢,添加where子句 – knatz

+1

沒有它,你的總數將是錯誤的。 – Horus

+0

爲了增加Horus的陳述,如果表格中包含2005年之前或2008之後的數據,那麼您的第一個「總計」列中的計數將會關閉。 – Jordan