2016-12-15 16 views
0

私はすべての人物の氏名でグループ化された請求書を含むカーソルを持っています。今、私はどの家族の名前がそれに対して未払いの請求書を持っているかを動的にチェックしたいと思います。たとえば。アダムズやペリーの家庭などがあります。カーソルはファミリのすべてのメンバの値を持ち、1つの列はファミリ名です。今私は未払いの金額を確認します、私は彼らがアダムスの家族の1つであることがわかります。今、私は家族の他のメンバーに請求書を配布することができるように私のカーソルがアダムス家族のすべてのメンバーを表示するようにします。すべての家族のメンバー間でアウト平均法案はwhere条件付きカーソル

CURSOR individual_cur is 
select name,family_name, bill from table1; 

CURSOR family_cur is 
    select family_name from table1; 

    for temp in family_cur loop 
    select sum(bill) into extra_bill where family_name is temp.family_name; 

    if extra_bill <>0 then 

    -- Now here I want 
    for temp1 in individual_cur loop *where family_name is temp.family_name* 

    -- How to do this. 
    end loop; 
+1

このため、低速カーソルを使用する必要は全くありません。これは単一のSQLクエリで行うことができます –

+0

@a_horse_with_no_nameこれで私を助けることができますか? http://stackoverflow.com/questions/41541100/fetch-table-name-from-a-column-for-from-clause – Akshay

答えて

1

は、ここで私はあなたが何をしようとして想定する例

declare 
    -- add family name as parameter 
    -- and use in where clause 
    cursor individual_cur(p_family_name table1.family_name%type) is 
     select name 
      ,family_name 
      ,bill 
     from table1 
     where family_name = p_family_name; 

    --group by family 
    -- and filter on sum(bill)<>0 
    cursor family_cur is 
     select family_name 
     from table1 
     group by family_name 
     having sum(bill)<>0; 
begin 

    for temp in family_cur 
    loop 
     -- select individuals from this family 
     for temp1 in individual_cur(temp.family_name) 
     loop 

      -- do something 
     end loop; 
    end loop; 
end; 

それとも

select name 
     ,family_name 
     ,bill 
    from table1 
    where family_name in (select family_name 
         from table1 
         group by family_name 
         having sum(bill)<>0) 
+0

ねえ、これで私を助けることができますか? http://stackoverflow.com/questions/41541100/fetch-table-name-from-a-column-for-from-clause – Akshay

0

ただ一つのクエリではありますでしょうか?もしそうなら、これは単一のクエリで行うことができます

WITH table1 AS (SELECT 'bob' NAME, 'jones' family_name, 0 bill FROM dual UNION ALL 
       SELECT 'jane', 'jones', 100 bill FROM dual UNION ALL 
       SELECT 'fred', 'jones', 50 bill FROM dual UNION ALL 
       SELECT 'bill', 'smith', 0 bill FROM dual UNION ALL 
       SELECT 'brenda', 'smith', 60 bill FROM dual UNION ALL 
       SELECT 'jill', 'smith', 0 bill FROM dual UNION ALL 
       SELECT 'bob', 'ingles', 0 bill FROM dual UNION ALL 
       SELECT 'carol', 'ingles', 0 bill FROM dual UNION ALL 
       SELECT 'rob', 'carolgees', 200 bill FROM dual) 
-- end of mimicking your table1 with sample data in it - you wouldn't need this 
-- see the SQL below 
SELECT NAME, 
     family_name, 
     bill, 
     AVG(bill) OVER (PARTITION BY family_name) split_bill 
FROM table1; 

NAME FAMILY_NAME  BILL SPLIT_BILL 
------ ----------- ---------- ---------- 
rob carolgees   200  200 
carol ingles    0   0 
bob ingles    0   0 
fred jones    50   50 
bob jones    0   50 
jane jones    100   50 
jill smith    0   20 
bill smith    0   20 
brenda smith    60   20 

これはAVG()集計関数のような行がどうなる圧縮せず、家族内のすべてのメンバー間で法案を分割するAVG()分析関数を使用しています。

あなたは、共有法案を反映するために、TABLE1を更新するために必要な場合は、あなたがして、MERGEステートメントにのようなもの上記のクエリを差し込むことができます:

merge into table1 tgt 
    using (select name, 
       family_name, 
       bill, 
       avg(bill) over (partition by family_name) split_bill 
     from table1) src 
    on (tgt.name = src.name and tgt.family_name = src.family_name) 
when matched then 
update set tgt.bill = src.split_bill 
where tgt.bill != src.split_bill; 
+0

あなたはこれで私を助けることができますか? http://stackoverflow.com/questions/41541100/fetch-table-name-from-a-column-for-from-clause – Akshay