2014-10-02 83 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的第一個服務日期和最後日期的價格之外,我得到了所有其他內容。如何獲得的第一個服務日期和最後一個服務日期

回答

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 

請注意,我改名爲你命名爲FIRSTprice和lastprice到FIRST_DATE和LAST_DATE列,因爲這個名字更涉及到哪些列不實際包含。

排在第二位:我在子查詢中使用了「select sum(price)」來處理同一輛汽車在同一天服務兩次的可能性。如果發生這種情況,如果沒有sum(),子查詢將提取多於一個值,並會給你一個運行時錯誤。如果日期字段也包含時間部分,那麼不太可能發生,而不僅僅是日期,但如果您的數據庫包含錯誤數據,它仍然可能發生。

如果您想保留sum()調用,或者如果您希望db在出現重複行時顯示錯誤,您不希望

相關問題