2012-08-27 85 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