2012-10-07 6 views
0

와 SQL에 다른 데이터에서 데이터를 찾을 수 :내가 테이블이 같은 얼마나 커서

create table police(
ssn 
name 
boss_name 
salary 
); 

Insert into police values(1,’A’,’C’,10000); 
Insert into police values(2,’B’,’D’,20000); 
Insert into police values(3,’C’,’E’,30000); 
Insert into police values(4,’D’,’E’,45000); 
Insert into police values(5,’E’,NULL,55000); 

나는 polices who have same boss에 대한 total salary을 반환하는 cursor를 원한다. 결과는 다음과 같습니다. 30000(salary of C)+45000(salary of D) 둘 다 보스 아래에 있습니다. 어떻게해야합니까? 내가 C와 D를 ORACLE pl/sql 또는 익명 블록에서 E 아래에있는 것처럼 찾는 방법은 무엇입니까?

set serveroutput on; 
declare 
cboss_name varchar2(30) ; 
csalary number ; 
CURSOR cur 
is  
    select boss_name,sum(salary) as salary 
    from police 
    where boss_name is not null 
    group by boss_name; 
begin 
    open cur; 
    fetch cur into cboss_name,csalary; 
    dbms_output.put_line('boss_name'||' '||'csalary'); 
    LOOP 
    FETCH cur INTO cboss_name,csalary; 
     EXIT WHEN cur%NOTFOUND; 
     dbms_output.put_line(cboss_name||'   '||csalary); 
    END LOOP; 

    close cur; 
end; 

Here 당신이 커서 및 루프에 대한 자세한 정보를 얻을 수 있습니다

+0

그게 기본 SQL은, 당신은 그룹을 사용할 수 있습니다. 귀하의 커서 쿼리는 '보스 이름으로 경찰 그룹에서 총액 (급여)를 선택 boss_name'처럼 될 것입니다. –

+0

Reg : "ORACLE pl/sql 또는 익명 블록에서 C 및 D를 찾는 방법".. 이것은 보고서와 같습니다 .. 원하는 형식에 따라 ... 찾고있는 출력은 무엇입니까? 에 대한? –

+0

@pratikgarg : 분석 함수를 사용할 수 있습니다. 'sum (salary) over partition (boss_name by ssn by order) total_salary' –

답변

-1

이 코드를 사용해보십시오.

+0

불필요한 PL/SQL 사용 이외에도 주니어 급여를 롤백하지 않습니다. 보스들을 위해 총 직원 수 – APC

+0

Parad ... 고맙습니다. 정확히 내가 무엇을 찾고 있습니다. :) – hitman047

+0

@APC이 문제가 해결되었습니다. – Parado

2

가우 라프 소니 (Gaurav Soni)와 APC는 그들의 의견에 훌륭한 조언을했습니다.

일반적인 경험 법칙 - 스트레이트 SQL로 쉽게 해결할 수있는 것들에는 커서를 사용하지 마십시오. 직선 SQL은 일반적으로 훨씬 빠릅니다.

다음 SQL은 각 보스, 직접 보고서의 총 급여 및 직접 보고서 수를 나열합니다.

select boss_name, 
     sum(salary) total_salary, 
     count(*) employee_count 
    from police 
where boss_name is not null 
group by boss_name 

위의 쿼리를 사용하여 보스를 반복해야하는 경우 커서를 정의 할 수 있습니다. 그러나 커서를 사용하여 합계를 계산해서는 안됩니다. SQL을 사용하십시오.