2016-04-24 16 views
0

私の演習では、テーブルからすべてのクライアントをループして、> 0.1の値を持つものを表示してください。割引に応じて私はケースを使用する必要があります。 タラにはデータが見つかりません。私がc.id_client = id_minの代わりにc.id_client = 1に置き換えても動作しますが、私はこれを望ましくありません。 コードは:繰り返し構造のケースを使用するpl/sqlの問題

Declare 
    v_nume clienti_sebi.nume %type; 
    v_prenume clienti_sebi.prenume %type; 
    v_count number; 
    v_discount number; 
    id_min clienti_sebi.id_client %type; 
    id_max clienti_sebi.id_client %type; 
Begin 

    select min(id_client), max(id_client) into id_min, id_max from clienti_sebi; 

    while id_min<id_max 
    loop 

    select c.nume, c.prenume, count(p.nr_polita)numar_polite, 
      (case 
      when count(p.nr_polita)=1 then 0.1 
      when count(p.nr_polita)=2 then 0.2 
      else 0.3 end) DC 
    into v_nume, v_prenume, v_count, v_discount 
    from clienti_sebi c, polita p 
    where c.id_client=p.id_client and c.id_client=id_min 
    group by c.nume, c.prenume; 

    dbms_output.put_line(id_min); 

    if v_discount > 0.1 then 
     dbms_output.put_line(v_nume || ' ' || v_prenume || ' ' || v_count || ' ' || v_discount); 
    else null; 
    end if; 

    id_min:=id_min+1; 

    end loop; 
end; 
/

答えて

0

あなたのコードは、現在お使いのid_clientシーケンスにギャップがないことを前提としています。これは、不必要な仮定であり、あなたのコードは、例えば、あなたのクエリをループ、代わりの最小/最大値を取得することにより、大幅に簡素化することができます

for r in (
    select c.nume, c.prenume, count(p.nr_polita) numar_polite, 
     (case 
      when count(p.nr_polita)=1 then 0.1 
      when count(p.nr_polita)=2 then 0.2 
      else 0.3 end) discount 
    from clienti_sebi c, polita p 
    group by c.nume, c.prenume 
) loop 

    if r.discount > 0.1 then 
    dbms_output.put_line(r.nume || ' ' || r.prenume || ' ' || r.numar_polite || ' ' || r.discount); 
    end if; 

end loop; 

ます。また、チェックすることを避けるためにHAVING句を使用することができ、あなたのループ内の条件:

for r in (
    select c.nume, c.prenume, count(p.nr_polita) numar_polite, 
     (case 
      when count(p.nr_polita)=1 then 0.1 
      when count(p.nr_polita)=2 then 0.2 
      else 0.3 end) discount 
    from clienti_sebi c, polita p 
    group by c.nume, c.prenume 
    having count(p.nr_polita) > 1 
) loop 

    dbms_output.put_line(r.nume || ' ' || r.prenume || ' ' || r.count || ' ' || r.discount); 

end loop; 
関連する問題