2014-10-02 7 views
0
DECLARE 
    v_in auto_service.vin%TYPE; 
    v_first auto_service.service_date%TYPE; 
    v_last auto_service.service_date%TYPE; 
    v_max auto_service.price%TYPE; 
    v_total auto_service.price%TYPE; 
    v_n NUMBER; 
    CURSOR c_auto 
    IS 
    SELECT vin, 
     COUNT(*)   AS no, 
     MIN(SERVICE_DATE) AS FIRSTprice, 
     MAX(SERVICE_DATE) AS lastprice, 
     max(price) as maxprice, 
     sum(price) as totalprice 
    FROM auto_service 
    GROUP BY vin; 
BEGIN 
    OPEN c_auto; 
    FETCH c_auto INTO v_in,v_n,v_first,v_last,v_total,v_max; 
    IF c_auto%notfound THEN 
    dbms_output.put_line('No output'); 
    ELSE 
    dbms_output.put_line('vin  No  firstprice  lastprice maximumprice totalprice'); 
    LOOP 
     dbms_output.put_line(rpad(v_in,10) || rpad(v_n,10) || rpad(v_first,10) || rpad(v_last,12) || rpad(v_max,15) || rpad(v_total,5)); 
     FETCH c_auto INTO v_in,v_n,v_first,v_last,v_max,v_total; 
     EXIT 
    WHEN c_auto%notfound; 
    END LOOP; 
    END IF; 
    CLOSE c_auto; 
END; 

의 가격을 얻을 수 있습니다 서비스, ​​최대 가격 및 최대 가격의 서비스 날짜 및 모든 서비스의 가격
첫 번째 서비스 날짜와 모든 VIN의 마지막 날짜는 제외하고 다른 모든 것들을 얻었습니다. 이 이름은 열이 포함 실제로 무엇을하는지에 더 관련이 있기 때문에 내가, 당신이 FIRST_DATE 및 LAST_DATE하는 FIRSTprice 및 lastprice라는 이름의 열을 이름어떻게 에게 마지막에 대한 서비스의 수, 첫 번째 서비스 날짜와 첫 번째 서비스의 가격, 마지막 서비스 날짜와 가격을 찾으려면 첫 번째 서비스 날짜와 마지막 서비스 날짜

답변

0
select q.*, 
      (
       select sum(price) 
       from auto_service x 
       where x.vin = q.vin 
       and x.service_date = q.FIRST_DATE 
      ) as FIRST_PRICE, 
      (
       select sum(price) 
       from auto_service x 
       where x.vin = q.vin 
       and x.service_date = q.LAST_DATE 
      ) AS LAST_PRICE 
    from 
    (
     SELECT vin, 
       COUNT(*)   AS no, 
       MIN(SERVICE_DATE) AS FIRST_DATE, 
       MAX(SERVICE_DATE) AS LAST_DATE, 
       max(price) as maxprice, 
       sum(price) as totalprice 
     FROM auto_service 
     GROUP BY vin 
    ) q 

알 수 있습니다.

두 번째 장소 : 나는 동일한 자동차가 같은 날에 두 번 서비스되었다는 가능성을 처리하기 위해서만 서브 쿼리에서 "select sum (price)"을 사용했습니다. 이 경우 sum()이 없으면 하위 쿼리는 값 이상을 추출하여 런타임 오류를 발생시킵니다. 날짜 필드에 날짜 부분뿐만 아니라 시간 부분이 포함되어있는 경우에도 DB에 불량 데이터가 포함 된 경우에도 문제가 발생할 가능성이 훨씬 적습니다.

sum() 호출을 유지하려는 경우 또는 예상치 못한 중복 행이있는 경우 db가 오류를 표시하기를 원할 경우

관련 문제