2013-09-26 10 views
5

Próbuję utworzyć widok z SET @rank = 0; wewnątrz, ale daje mi błędy. Próbowałem różnych rzeczy, ale to nie działa. Czy ktoś może wskazać mi właściwy kierunek?MySQL - Nie można utworzyć widoku ze zmienną SET wewnątrz

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

Komunikat o błędzie:

#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

Jaki jest Twój Wersja mysql? Próbowałem stworzyć widok, który zawiera instrukcję select z @variables, ale mówi: "View SELECT zawiera zmienną lub parametr" –

Odpowiedz

5

myślę, że nie mogę tego zrobić.

Począwszy od MySQL guidelines:

A view definition is subject to the following restrictions:

[ deletia ]

The SELECT statement cannot refer to system or user variables.

+2

Czy istnieje alternatywa dla VIEW? –

+0

Alternatywa w jakim sensie ??? –

4

Widoki są SELECT, nic więcej. Widoki nie mogą być wielokrotnymi instrukcjami. Jeśli nie możesz uzyskać tego widoku w dół do pojedynczego zdania, wypróbuj propozycję here, aby użyć funkcji lub procedury.

Wypróbuj propozycję this dla MYSQL za pomocą łączenia zamiast zestawu.

JOIN (SELECT @rank:= 0) r; 

Oto niesprawdzone przykład, nie jestem pewien, czy można zamówić przez „#” na końcu, ale jeśli można byłoby uporządkować wszystko poprawnie przez Rank:

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

Próbowałem, ale nie podałem numeru. zaczyna się od 58, a następnie od 5, 8 itd. ... –

+0

Pamiętaj, że masz GROUP BY ei.emp_id ORDER BY es.AHT DESC LIMIT 80); Może to zepsuć porządek twojej rangi. Mogę spróbować, aby twoje obecne wybrało pod-zapytanie, zrywając jego pozycję, a następnie wybierając zewnętrzny, który wybierze aktualną kwerendę i doda pozycję do ostatecznego zestawu wyników. – Vulcronos

+0

Czy mógłbyś rozwinąć? –

Powiązane problemy