带 where 条件的游标
Cursor with where condition
我有一个游标,其中包含按姓氏分组的所有人的账单。现在,我想动态检查哪个姓氏有未付账单。例如。有亚当斯和佩里家族等等。游标具有所有家族成员的值,其中一列是家族名称。现在我检查未付金额,我发现他们是亚当斯家族的一个。现在,我希望我的光标显示亚当斯家族的所有成员,以便我可以将账单分发给该家族的其他成员。
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;
这是一个例子
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)
我猜你想做的是平均所有家庭成员的账单?如果是这样,那么这可以在一个查询中完成:
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()
聚合函数那样压缩行。
如果随后需要更新表 1 以反映共享账单,则可以将上述查询插入到 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;
我有一个游标,其中包含按姓氏分组的所有人的账单。现在,我想动态检查哪个姓氏有未付账单。例如。有亚当斯和佩里家族等等。游标具有所有家族成员的值,其中一列是家族名称。现在我检查未付金额,我发现他们是亚当斯家族的一个。现在,我希望我的光标显示亚当斯家族的所有成员,以便我可以将账单分发给该家族的其他成员。
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;
这是一个例子
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)
我猜你想做的是平均所有家庭成员的账单?如果是这样,那么这可以在一个查询中完成:
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()
聚合函数那样压缩行。
如果随后需要更新表 1 以反映共享账单,则可以将上述查询插入到 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;