2013-09-12 2 views
1

У меня есть следующий запрос, который используется в хранимой процедуре. Я пытаюсь упростить логику в инструкции CASE. В частности, я хотел бы вложить продукт в UserGroup.Упростить логику запросов sql

SELECT DCMNumber, 
     SUM(CONVERT(INT, CurrentlyAssigned)) AS PriorAssigned 
FROM dbo.cauAssignedClaim WITH(NOLOCK) 
WHERE RecordType = 'A' 
    AND ([Status] <> 'DE' OR [Status] IS NULL) 
    AND DATEADD(dd, 0, DATEDIFF(dd, 0, EntryDate)) 
     BETWEEN 
      CASE 
      WHEN Product IN('LTD', 'LTDCP') AND @UserGroup = '' OR @UserGroup = 'NONE'  
       THEN DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()-30)) 
      WHEN Product IN('STD', 'STDCP', 'SALCN', 'STAT', 'OFFOV') AND @UserGroup = '' OR @UserGroup = 'NONE' 
       THEN DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()-14)) 
      WHEN Product IN('LTD', 'LTDCP') AND @UserGroup IN('SSAT', 'TCMS') 
       THEN DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()-7)) 
      WHEN Product IN('STD', 'STDCP', 'SALCN', 'STAT', 'OFFOV') AND @UserGroup IN('Appeals', 'DMS', 'Life', 'WOP', 'IWOP') 
       THEN DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()-7)) 
      END 
     AND DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()-1)) 
GROUP BY [Status], DCMNumber 
+3

Что это за выражение? '([Status] <> 'DE' ИЛИ ​​[Status] IS NULL AND [Status] IS NULL)' –

+0

Значения «@» в случае/когда являются значениями, переданными в хранимую процедуру – user1331734

ответ

1

Это из оригинала:

BETWEEN 
     CASE 
     WHEN Product IN('LTD', 'LTDCP') AND @UserGroup = '' OR @UserGroup = 'NONE'  
      THEN DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()-30)) 
     WHEN Product IN('STD', 'STDCP', 'SALCN', 'STAT', 'OFFOV') AND @UserGroup = '' OR @UserGroup = 'NONE' 
      THEN DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()-14)) 
     WHEN Product IN('LTD', 'LTDCP') AND @UserGroup IN('SSAT', 'TCMS') 
      THEN DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()-7)) 
     WHEN Product IN('STD', 'STDCP', 'SALCN', 'STAT', 'OFFOV') AND @UserGroup IN('Appeals', 'DMS', 'Life', 'WOP', 'IWOP') 
      THEN DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()-7)) 
     END 
    AND DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()-1)) 

Может вынесет функцию даты, как это:

BETWEEN DATEADD(dd, DATEDIFF(dd, 0, GETDATE() - 
     CASE 
     WHEN Product IN('LTD', 'LTDCP') AND @UserGroup IN ('', 'NONE') THEN 30 
     WHEN Product IN('STD', 'STDCP', 'SALCN', 'STAT', 'OFFOV') AND @UserGroup IN ('', 'NONE') THEN 14 
     WHEN (Product IN('LTD', 'LTDCP') AND @UserGroup IN ('SSAT', 'TCMS')) 
      OR (Product IN('STD', 'STDCP', 'SALCN', 'STAT', 'OFFOV') AND @UserGroup IN('Appeals', 'DMS', 'Life', 'WOP', 'IWOP')) 
      THEN 7 
     END)) 
    AND DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()-1)) 

В зависимости от возможных значений для вашего Product столбца, вы можете также быть в состоянии что-то вроде:

CASE WHEN Product LIKE 'LTD%' ... 
     WHEN Product LIKE 'STD%' ... 

Наконец, вам не хватает случая по умолчанию. Вы можете полностью удалить одно из этих условий, заменив его предложением ELSE, и я очень рекомендую это сделать. Я подозреваю, что самым точным значением по умолчанию будет 30, но наибольшее упрощение может быть выполнено по умолчанию: 7:

BETWEEN DATEADD(dd, DATEDIFF(dd, 0, GETDATE() - 
     CASE 
     WHEN Product LIKE 'LTD%' AND @UserGroup IN ('', 'NONE') THEN 30 
     WHEN Product IN ('STD', 'STDCP', 'SALCN', 'STAT', 'OFFOV') AND @UserGroup IN ('','NONE') THEN 14 
     ELSE 7 
     END)) 
    AND DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()-1)) 
+0

Спасибо Joel! Я очень ценю ваше решение. – user1331734

Смежные вопросы