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`

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

上記の従業員数は、単一選択として記述した場合に異なります。ここで、もう 1 つの結合に別のテーブルを使用しました。例えば

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」の単一選択クエリとして記述した場合、結果は同じですが、注文された ID が販売テーブルにも存在するため、「prod_ordered」が増加します。単一の選択内に書き込むことで同じ無感覚を維持する方法を誰かが考えてもらえますか?

4

1 に答える 1

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
于 2013-10-29T13:03:19.180 に答える