2012-08-27 115 views
0

我正在嘗試創建一個存儲過程,用於將呼叫分配給呼叫者。我們有幾個由變量@team_id標識的調用者小組。我想要做的是檢查並確定客戶(@code)是否有人分配給他們。如果他們這樣做,則返回該人的ID。如果沒有,請運行THEN語句來確定應將其分配給誰,將記錄更新爲該調用方,然後返回該調用方的標識。這是我的,但它不會讓我運行選擇內的更新。如果可以的話,我想避免每次更新表(將更新子句添加到存儲過程的末尾)。案例中的SQL Server 2008更新

declare @team_id char(3), @code char(4) 
--If team is an intake department 
if (@team_id IN ('03V', '09X')) 
SELECT 
    CASE 
     WHEN a.intake_caller_id IS NOT NULL and a.intake_caller_id <> '' THEN a.intake_caller_id 
     ELSE 
      (
       SELECT employee_id 
       FROM 
       (
        SELECT TOP 1 COUNT(a.id) as count, a.employee_id 
        FROM event.dbo.event a 
        JOIN event.dbo.event_triage b ON a.employee_id = b.employee_id 
        WHERE task_id in ('WS', 'WF', 'WT', 'WU') and a.status = 1 AND b.team_id = @team_id 
        GROUP BY a.employee_id 
        ORDER BY count ASC 
       ) a 
       update event.dbo.referral_data 
       SET intake_caller_id = a.employee_id 
       WHERE CODE_ = @code 
      ) 
     END 
    FROM event.dbo.referral_data a 
    WHERE CODE_ = @code 
ELSE 
--if team is a PO department 
IF (@team_id IN ('00R', '154')) 
    SELECT 
     CASE 
      WHEN @team_id = '00R' AND intake_rx_caller_id IS NOT NULL AND intake_rx_caller_id <> '' THEN intake_rx_caller_id 
      WHEN @team_id = '00R' AND (intake_rx_caller_id IS NULL OR intake_rx_caller_id = '') THEN 
       (
        SELECT employee_id 
        FROM 
        (
         SELECT top 1 COUNT(a.id) as count, a.employee_id 
         FROM event.dbo.event a 
         JOIN event.dbo.event_triage b ON a.employee_id = b.employee_id 
         WHERE task_id IN ('WR', 'CR') AND status = 1 and b.team_id = '00R' 
         GROUP BY a.employee_id 
         ORDER BY count ASC 
        ) a 
       ) 
      WHEN @team_id = '154' AND reorder_rx_caller_id IS NOT NULL AND reorder_rx_caller_id <> '' THEN reorder_rx_caller_id 
      WHEN @team_id = '154' AND (reorder_rx_caller_id IS NULL OR reorder_rx_caller_id = '') THEN 
       (
        SELECT employee_id 
        FROM 
        (
         SELECT top 1 COUNT(a.id) as count, a.employee_id 
         FROM event.dbo.event a 
         JOIN event.dbo.event_triage b ON a.employee_id = b.employee_id 
         WHERE task_id IN ('RS', 'RY') AND status = 1 and b.team_id = '154' 
         GROUP BY a.employee_id 
         ORDER BY count ASC 
        )a 
       ) 
      END 
    FROM event.dbo.doctor_data 
    WHERE CODE_ = @code 
+0

更新不工作,因爲它是內部SELECT。它應該在它之後。 – Farhan

回答

0

爲什麼不先更新然後在第一個IF語句裏面選擇一個select。 您可以在更新語句中應用相同的條件邏輯。

編輯:這裏是code.Not雖然測試....

DECLARE @team_id CHAR(3) 
, @code CHAR(4) 
IF (@team_id IN ('03V' , '09X')) 
    BEGIN 

     ;WITH CTE 
       AS (SELECT TOP 1 
           COUNT(a.id) AS count 
           , a.employee_id 
        FROM  event.dbo.event a 
           JOIN event.dbo.event_triage b 
             ON a.employee_id = b.employee_id 
        WHERE  task_id IN ('WS' , 'WF' , 'WT' , 'WU') 
           AND a.status = 1 
           AND b.team_id = @team_id 
        GROUP BY a.employee_id 
        ORDER BY count ASC 
        ) 
       UPDATE  a 
       SET   intake_caller_id = (SELECT employee_id FROM CTE) 
       FROM  event.dbo.referral_data AS a 
       WHERE  CODE_ = @code 
          AND ISNULL(a.intake_caller_id,'')=''          

     SELECT  a.intake_caller_id 
     FROM  event.dbo.referral_data a 
     WHERE  CODE_ = @code 
    END 
ELSE 
    IF (@team_id IN ('00R' , '154')) 
     BEGIN 
       SELECT  CASE WHEN @team_id = '00R' 
            AND intake_rx_caller_id IS NOT NULL 
            AND intake_rx_caller_id <> '' THEN intake_rx_caller_id 
           WHEN @team_id = '00R' 
            AND (intake_rx_caller_id IS NULL 
              OR intake_rx_caller_id = '' 
             ) THEN (SELECT employee_id 
               FROM (SELECT TOP 1 
                    COUNT(a.id) AS count 
                    , a.employee_id 
                  FROM  event.dbo.event a 
                    JOIN event.dbo.event_triage b 
                      ON a.employee_id = b.employee_id 
                  WHERE  task_id IN ('WR' , 'CR') 
                    AND status = 1 
                    AND b.team_id = '00R' 
                  GROUP BY a.employee_id 
                  ORDER BY count ASC 
                 ) a 
               ) 
           WHEN @team_id = '154' 
            AND reorder_rx_caller_id IS NOT NULL 
            AND reorder_rx_caller_id <> '' THEN reorder_rx_caller_id 
           WHEN @team_id = '154' 
            AND (reorder_rx_caller_id IS NULL 
              OR reorder_rx_caller_id = '' 
             ) THEN (SELECT employee_id 
               FROM (SELECT TOP 1 
                    COUNT(a.id) AS count 
                    , a.employee_id 
                  FROM  event.dbo.event a 
                    JOIN event.dbo.event_triage b 
                      ON a.employee_id = b.employee_id 
                  WHERE  task_id IN ('RS' , 'RY') 
                    AND status = 1 
                    AND b.team_id = '154' 
                  GROUP BY a.employee_id 
                  ORDER BY count ASC 
                 ) a 
               ) 
          END 
       FROM  event.dbo.doctor_data 
       WHERE  CODE_ = @code 
     END 
+0

謝謝,我使用了你的建議,並首先做出了更新聲明(如果需要更新),然後做了簡單的選擇。 – Mike