2011-08-25 27 views
1

我要编写一个存储函数来检索已在上一年交付的给定产品的项目数,然后编写一个SQL Select语句,使用该函数显示产品号和名称+否所有产品在去年交付的物品。SQL存储函数

请帮我

感谢

+3

SQL Server或Oracle?或两者??另外:请**展示我们**您的餐桌结构,以便我们知道我们正在处理的事情! –

+0

如果可能的话oracle,感谢您的快速回复 – user911534

+0

你能否让我知道我该如何在这里添加表结构,对不起,我在这里是相当新的 – user911534

回答

2

我假设你有一个交货表和产品表。

create or replace function prod_delivered_cnt (p_prod_id in number) as 
    v_res number; 
begin 
    select count(*) into v_res 
    from delivery_table d 
    where d.prod_id = p_prod_id 
    and d.date < to_date('2011', 'yyyy'); 
    return v_res; 
end prod_delivered_cnt; 

select p.prod_num, p.prod_name, prod_delivered_cnt(p.id) as cnt 
from product_table p; 
+0

你可以帮我多一点,请创建一个函数来检索员工表的经理姓名。编写一个SQL select语句,使用该函数生成员工编号和姓名列表以及他们的经理姓名 – user911534

+0

对不起,先生,这将是一个新问题,我可能还会回答这个问题,一旦这个问题被正确关闭/接受。另外,请注意所有建议提供这些问题的更多细节的意见。我的意思是你应该提供表结构和数据库供应商,如果你想得到一个包含工作代码的答案。 – bpgergo

+0

谢谢,我会把这个问题作为新的。此外,我在这里很新,并没有太多的想法如何将ERD图像放在这里,你能帮我吗,这将是高度appriciated – user911534

3

大概你的问题是由学校或大学作业提示的。至少我希望是这样,因为使用函数来达到这个目的是不好的做法。由于SQL和PL/SQL引擎之间的不断切换,并且因为它逐行查询交付而不是使用set操作,所以它执行得很糟糕。

简单的纯SQL语句表现更好。我选择使用外连接,因为您可能希望包含去年没有任何活动的产品。

select p.product_id 
     , p.product_name 
     , count(d.delivery_id) as sales_this_year 
from products p 
    left outer join deliveries d 
     on (p.product_id = d.product_id) 
where d.dispatch_date >= add_months(sysdate, -12) 
group by p.product_id, p.product_name 
/

我已经“在去年”解释为过去的十二个月内,因此使用了ADD_MONTHS()函数。一个不同的解释将有一个这样的WHERE子句:

where d.dispatch_date between to_date('01-JAN-2010') and to_date('31-DEC-2010') 

也就是上一个日历年;或者:

where d.dispatch_date >= trunc(sysdate, 'YYYY') 

也就是这个日历年。