Печать с помощью петель в sql - PullRequest
0 голосов
/ 21 марта 2019

Привет, я написал процедуру для выполнения задачи, и это выглядит так

create or replace procedure myproc 
is
begin
  for rec_ in (
    select
      case 
        when highest_ = 1 then 
          'Most profit in ' || category || ' -> ' || carname || ': ' || aprofit
        when lowest_ = 1 then 
          'Least profit in ' || category || ' -> ' || carname || ': ' || aprofit
      end report
    from (
      select 
        category
      , carname
      , aprofit
      , rank() over ( partition by category order by aprofit asc ) lowest_
      , rank() over ( partition by category order by aprofit desc ) highest_
      from (
        select unique
          C.category
        , C.carname
        , avg( R.rentalrate - C.suggesteddealerrentalprice ) 
          over ( partition by C.category, C.carname ) as aprofit
        from rentals R 
          join car C on R.carid = C.carid 
          join cardealers CD on CD.dealerid = C.dealerid
        where CD.state = 'IN'
      )
    ) 
    where lowest_ = 1 or highest_ = 1 
    order by case when lowest_ > 1 then 2 else 1 end, category, carname
  )
  loop
    dbms_output.put_line( rec_.report ) ;
  end loop ;
end ;
/
begin 
  myproc ;
end ;
/

Это распечатывает вывод, который похож на это

Least profit in compact -> Nissan Versa: 4
Least profit in compact -> Toyota Yaris: 4
Least profit in luxury -> Porsche: 40
Least profit in van -> Chrysler: 2
Most profit in compact -> Chevy Spark: 5
Most profit in luxury -> Audi: 45
Most profit in van -> Honda Odyssey: 9

Я хочу, чтобы это распечатывалось следующим образом: если в категории автомобилей имеется более одного автомобиля, то заголовок печатается только один раз. Но, как вы можете видеть в моем выводе, заголовок «Наименьшая прибыль в компакте» печатается два раза. Я хочу вывод, который выглядит следующим образом

Least Profit in compact
- Nissan Versa: 4
- Toyota Yaris: 4
Least Profit in luxury
- Porsche: 40
Least Profit in van 
- Chrysler: 2
Most Profit in compact
- Chevy Spark: 5
Most Profit in luxury
- Audi: 45
Most Profit in van 
- Honda Odyssey: 9

Таблицы и файлы данных Файл данных Файл таблиц

1 Ответ

2 голосов
/ 21 марта 2019

Вы можете выбрать столбцы Least/Most,category,carname,aprofit отдельно от вашего запроса выбора, а затем использовать условно DBMS_OUTPUT.

Я использовал ваш образец набора данных из вывода в приведенном ниже коде, так как у меня нет вашей таблицы/ определения.

DECLARE
 v_high_low VARCHAR2(40) := 'DUMMY';
 v_category VARCHAR2(40) := 'DUMMY';
BEGIN
for rec_ IN
 (
with t (high_low,category,carname,aprofit) AS
  (
   select 'Least profit in ','compact', 'Nissan Versa', 4    from dual union all
   select 'Least profit in ','compact','Toyota Yaris',  4    from dual union all
   select 'Least profit in ','luxury','Porsche',        40   from dual union all
   select 'Least profit in ','van','Chrysler',          2    from dual union all
   select 'Most profit in ','compact','Chevy Spark',    5    from dual union all
   select 'Most profit in ','luxury','Audi',            45   from dual union all
   select 'Most profit in ','van', 'Honda Odyssey',     9    from dual 
   )
 SELECT * FROM t order by high_low,category,carname
  ) 
  LOOP
        IF rec_.high_low  != v_high_low OR rec_.category != v_category
         THEN
           DBMS_OUTPUT.PUT(rec_.high_low);
           v_high_low := rec_.high_low;
         END IF;
        IF rec_.category != v_category 
          THEN
           DBMS_OUTPUT.PUT_LINE(rec_.category);
          v_category := rec_.category;
        END IF;
        DBMS_OUTPUT.PUT_LINE(' - '||rec_.carname||': '|| rec_.aprofit);

   END LOOP;
END;
/

ДЕМО

РЕДАКТИРОВАТЬ - Добавление этой демонстрационной ссылки с процедурой с предоставлением фактических таблиц: DEMO2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...