2013-09-26 189 views
5

Tôi đang cố gắng tạo chế độ xem với SET @rank = 0; bên trong nhưng nó cho tôi lỗi. Đã thử những thứ khác nhau nhưng nó không hoạt động. Bất cứ ai có thể xin vui lòng chỉ cho tôi đi đúng hướng?MySQL - Không thể tạo chế độ xem có biến SET bên trong

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); 

Thông báo lỗi:

#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

của bạn là gì phiên bản mysql? Tôi đã cố gắng tạo ra một khung nhìn có chứa câu lệnh select với @variables, nhưng nó nói 'Xem của SELECT chứa một biến hoặc tham số' –

Trả lời

5

Tôi nghĩ rằng bạn không thể làm điều đó.

Kể từ MYSQL guidelines:

A view definition is subject to the following restrictions:

[ deletia ]

The SELECT statement cannot refer to system or user variables.

+2

Có cách nào khác để xem không? –

+0

Thay thế theo nghĩa nào ??? –

4

Lượt xem là câu chọn, không có gì hơn. Chế độ xem không thể là nhiều câu lệnh. Nếu bạn không thể hiển thị chế độ xem này xuống một tuyên bố, hãy thử đề xuất here để sử dụng hàm hoặc thủ tục.

Hãy thử this đề xuất cho MYSQL bằng cách sử dụng tham gia thay vì tập hợp.

JOIN (SELECT @rank:= 0) r; 

Dưới đây là một ví dụ chưa được kiểm tra, tôi không chắc chắn nếu bạn có thể đặt hàng bằng '#' ở cuối, nhưng nếu bạn có thể nó sẽ sắp xếp mọi thứ một cách chính xác bằng cách cấp bậc:

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

Tôi đã thử điều đó nhưng nó không cho tôi số thứ tự. nó bắt đầu từ 58 và sau đó là 5, 8, v.v. –

+0

Lưu ý rằng bạn có GROUP BY ei.emp_id ORDER BY es.AHT DESC LIMIT 80); Điều này có thể gây rối trật tự xếp hạng của bạn. Tôi có thể thử làm cho hiện tại của bạn chọn một truy vấn phụ, lấy thứ hạng ra khỏi nó, sau đó thực hiện một lựa chọn bên ngoài mà chọn từ truy vấn hiện tại của bạn và thêm vào thứ hạng vào tập kết quả cuối cùng của bạn. – Vulcronos

+0

Bạn có thể vui lòng xây dựng? –