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