2015-05-13 16 views
0

我想創建函數或視圖,每月顯示特定年份的某些信息。使用參數調用函數或視圖

CREATE OR REPLACE VIEW name_view AS 
    SELECT d_name, 
    SUM("Jan") "Jan", 
    SUM("Feb") "Feb" 
    ... 
    FROM (
    select distinct d_name, 
     COUNT(CASE WHEN EXTRACT (MONTH FROM h_date) = '01' THEN query_string ELSE NULL END) "Jan", 
     COUNT(CASE WHEN EXTRACT (MONTH FROM h_date) = '02' THEN query_string ELSE NULL END) "Feb", 
    .. 
     from h 
      inner join d on h_d = d_id 
       WHERE EXTRACT (YEAR FROM h_date) = '2015' 
      GROUP BY d_name) sub query 
    GROUP BY d_name 

我如何可以調用視圖像這樣沒有

WHERE提取物(一年h_date)= '2015年'

,但與呼叫的一年?例如

SELECT * FROM name_view( '2015')

+1

創建返回表函數的任何日期。 –

+1

您應該創建一個存儲過程,而不是@@「 – User2012384

回答

1

你應該在選擇使用一年,當你從視圖中選擇您使用WHERE年= 2015

CREATE OR REPLACE VIEW name_view AS 
SELECT d_name, 
SUM("Jan") "Jan", 
SUM("Feb") "Feb", 
YEAR, 
.... 

使用視圖:

SELECT * 
FROM name_view 
WHERE year = '2015'; 
1

您可以試試這個函數傳遞日期作爲參數:

CREATE OR REPLACE FUNCTION "show_info"("DATE" date) 
    RETURNS SETOF show_info AS 
$BODY$SELECT d_name, 
    SUM("Jan") "Jan", 
    SUM("Feb") "Feb" 
    ... 
    FROM (
    select distinct d_name, 
     COUNT(CASE WHEN EXTRACT (MONTH FROM h_date) = '01' THEN query_string ELSE NULL END) "Jan", 
     COUNT(CASE WHEN EXTRACT (MONTH FROM h_date) = '02' THEN query_string ELSE NULL END) "Feb", 
    .. 
     from h 
      inner join d on h_d = d_id 
       WHERE EXTRACT (YEAR FROM h_date) = $1 
      GROUP BY d_name) subquery 
    GROUP BY d_name 
;$BODY$ 
    LANGUAGE sql VOLATILE 
    COST 100 
    ROWS 1000; 

你可以這樣調用它

select * from show_info(date) 

此日期將要傳遞

+0

此函數將失敗,」SHOW_INFO「和」show_info「不一樣。建議:不要使用雙引號」並且不要使用UPPER CASE字符作爲對象名稱像函數名稱。 –

+0

@FrankHeikens我編輯了我的答案。我刪除了雙引號,並以小寫字母更改了函數名稱。感謝更正:) – Madhusudan