2011-08-25 60 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') 

也就是這個日曆年。