2013-10-29 178 views
0

我有這樣的查詢與多個工會多個工會和不同的計數優化查詢:基於條件

select count(emp.emp_id) "No.of emp with sal above 30k" from emp,dept 
where emp.emp_sal > 30000 
and emp.emp_id=dept.emp_id 
union 
select count(emp.emp_id) "No.of emp with age above 50" from emp 
where emp.emp_age < 50 
and emp.emp_id=dept.emp_id 
union 
select count(emp.emp_id) "No.of emp doing over time" from emp 
where emp.work_time > 10 
and emp.emp_id=dept.emp_id` 

我想上面的查詢組合成單個查詢象下面這樣:

Select emp_id,emp_name, 
case 
when emp.emp_sal > 30000 then 1 
when emp.emp_age < 50 then 2 
when emp.work_time > 10 then 3 
end 
from emp,dept 
where emp.emp_id=dept.emp_id` 

如何在案例陳述中包含emp_id的計數? 我想單獨查看所有員工數量。

樣本輸出將是:

"No.of emp with sal above 30k" 200 
"No.of emp with age above 50" 100 
"No.of emp doing over time"  50 

員工以上數的不同而不同,當我寫單選擇。 現在我使用了不同的表格再進行一次連接。例如

select count(p_id) "Sold Prod" from prod,sale 
where prod.p_id=sale.p_id and sale.p_name='SAMSUNG' 
union 
select count(p_id) "Prod Ordered" from prod, order 
where order.p_id=prod.p_id and order.order_dt > '01-Jan-2013' 

以上參加時,我寫爲「賣PROD」單選擇查詢的結果都是相同的,而「prod_ordered」增加,因爲有序的ID,在銷售表中也存在。任何人都可以提供一些想法如何通過在單選內寫入來保持同樣的麻木?

回答

1

在你的SELECT語句,你可以指望根據案件像這樣:

SUM(CASE WHEN emp.emp_sal > 30000 THEN 1 Else 0 End) AS EmpSalary30000, 
SUM(CASE WHEN emp.emp_age < 50 THEN 1 Else 0 End) AS EmpAgeLess50, 
SUM(CASE WHEN emp.work_time > 10 THEN 1 Else 0 End) AS EmpWorkTimeGreat10 
+0

謝謝你,是非常有益的... – user2931800

+0

** @ user2931800 **,做到了解決問題了嗎?如果是這樣,請標記爲已接受的答案。 – Linger

+0

** @ Gordon Linoff **,感謝您的編輯。你說得對,它應該是SUM。 – Linger