2013-09-26 30 views
5

我試圖用SET @rank = 0;創建一個視圖,但它給了我錯誤。一直嘗試不同的事情,但它不工作。任何人都可以請我指出正確的方向?MySQL - 無法使用SET變量創建視圖

CREATE VIEW S1_Bottom_Performer_AHT as (
SET @rank=0 
SELECT @rank := @rank+1 AS '#', 
       ei.SM, 
       ei.TM, 
       es.Month_Date, 
       ei.emp_id, 
       ei.DNAME, 
       ei.STATUS, 
       ei.SHIFT, 
       ei.SKILL, 
       ei.HIRE_DATE, 
       ifnull(TIMESTAMPDIFF(MONTH, ei.HIRE_DATE, now()), '-') AS Tenure, 
       ifnull(es.Call_Handled, '-') AS Call_Handled, 
       ifnull(es.AHT, '-') AS AHT 
FROM mtl_extended_info ei 
LEFT OUTER JOIN 
    (SELECT es.Employee_ID, 
      es.Month_Date, 
      sum(es.Calls_Handled_Ct) AS Call_Handled, 
      round((sum(es.I_Talk_Time_Sec) + sum(es.Hold_Time_Sec) + sum(es.I_Work_Time_Sec) + sum(es.I_AUX_Out_Time_Sec))/sum(es.Calls_Handled_Ct)) AS AHT 
    FROM cdl_agent_call_voume_gen es 
    WHERE es.Month_Date = '2013-09-01' 
    GROUP BY es.Employee_ID, 
      es.Month_Date) es ON es.Employee_ID = ei.emp_id 
WHERE es.Month_Date = '2013-09-01' 
    AND ei.Visible = 1 
    AND ei.SKILL != 'RSD' 
GROUP BY ei.emp_id 
ORDER BY es.AHT DESC LIMIT 80); 

錯誤消息:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SET @rank=0 
SELECT @rank := @rank+1 AS '#', 
       ei.SM, 
      ' at line 2 
+0

你是什麼mysql版本?我試圖創建一個包含帶有@variables的選擇語句的視圖,但它說'視圖的SELECT包含一個變量或參數' –

回答

5

我認爲你不能做到這一點。

由於從MYSQL guidelines

A view definition is subject to the following restrictions:

[ deletia ]

The SELECT statement cannot refer to system or user variables.

+2

VIEW是否有其他選擇? –

+0

在某種意義上的替代? –

4

視圖是SELECT語句,僅此而已。視圖不能是多個語句。如果您無法將此視圖歸爲單個語句,請嘗試使用建議here以使用函數或過程。

嘗試this建議MYSQL使用聯接而不是一組。

JOIN (SELECT @rank:= 0) r; 

這是一個未經測試的例子,我不知道,如果你可以通過「#」末訂貨,但如果你能會正確地排序排列的一切:

CREATE VIEW S1_Bottom_Performer_AHT as (
SELECT @rank := @rank+1 AS '#', * 
FROM 
(SELECT   ei.SM, 
       ei.TM, 
       es.Month_Date, 
       ei.emp_id, 
       ei.DNAME, 
       ei.STATUS, 
       ei.SHIFT, 
       ei.SKILL, 
       ei.HIRE_DATE, 
       ifnull(TIMESTAMPDIFF(MONTH, ei.HIRE_DATE, now()), '-') AS Tenure, 
       ifnull(es.Call_Handled, '-') AS Call_Handled, 
       ifnull(es.AHT, '-') AS AHT 
FROM mtl_extended_info ei 
LEFT OUTER JOIN 
    (SELECT es.Employee_ID, 
      es.Month_Date, 
      sum(es.Calls_Handled_Ct) AS Call_Handled, 
      round((sum(es.I_Talk_Time_Sec) + sum(es.Hold_Time_Sec) + sum(es.I_Work_Time_Sec) + sum(es.I_AUX_Out_Time_Sec))/sum(es.Calls_Handled_Ct)) AS AHT 
    FROM cdl_agent_call_voume_gen es 
    WHERE es.Month_Date = '2013-09-01' 
    GROUP BY es.Employee_ID, 
      es.Month_Date) es ON es.Employee_ID = ei.emp_id 
WHERE es.Month_Date = '2013-09-01' 
    AND ei.Visible = 1 
    AND ei.SKILL != 'RSD' 
GROUP BY ei.emp_id 
ORDER BY es.AHT DESC LIMIT 80) 
) AS RESULTS 
JOIN (SELECT @rank:= 0) r; 
ORDER BY '#' 
+0

我試過了,但它沒有給我編號。它從58開始,然後是5,8等等。 –

+0

請注意,你有GROUP BY ei.emp_id ORDER BY es.AHT DESC LIMIT 80);這可能會弄亂你的排名順序。我可能會嘗試讓當前選擇一個子查詢,從中排除等級,然後創建一個外部選擇,從當前查詢中進行選擇並將其添加到最終結果集中。 – Vulcronos

+0

你能否詳細說明一下? –