如何获得第一个服务日期和上次服务日期的价格

时间:2014-10-02 00:05:59

标签: plsqldeveloper

 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的最后日期之外,我还得到了所有其他的东西。

1 个答案:

答案 0 :(得分: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显示错误,则由您决定