根据条件使用多个联合和不同计数优化查询

时间:2013-10-29 12:56:49

标签: sql query-optimization case

我有多个联盟的查询:

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`

如何在case语句中包含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'

当我为“sold Prod”编写单选选项查询时,上面的连接结果相同,而“prod_ordered”增加,因为有序ID也出现在销售表中。任何人都可以通过在单一选择中书写来了解如何保持同样的麻木吗?

1 个答案:

答案 0 :(得分:1)

在SELECT语句中,您可以根据CASE计算:

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