2012-08-07 66 views
0

我想弄清楚如何在where子句中使用case语句以便根据Product type列选择特定条件。 where子句的第一部分对于这两种情况都是通用的。如果产品类型是STD,则需要检查EntryDate是否在当前月份的第一天到昨天之间。如果产品是LTD,那么我需要检查EntryDate是否在昨天到七天前。根据列值更改where子句条件

DECLARE @firstDayOfCurrentMonth datetime 
SET @firstDayOfCurrentMonth = CAST(CAST(YEAR(GETDATE()) AS VARCHAR(4)) + '/' + CAST(MONTH(GETDATE()) AS VARCHAR(2)) + '/01' AS DATETIME) 

SELECT DCMNumber, COUNT(*) AS PriorDenied 
FROM cauAssignedClaim 
WHERE RecordType = 'A' AND [Status] IS NULL AND 
CASE WHEN Product = 'LTD' THEN EntryDate BETWEEN @firstDayOfCurrentMonth AND GETDATE()-1 
CASE WHEN Product = 'STD' THEN EntryDate BETWEEN DATEADD(Day, -7, GETDATE()-1) AND GETDATE()-1 
END 
GROUP BY [Status], DCMNumber 

回答

0

你想

WHERE EntryDate BETWEEN 
    CASE WHEN Product = 'LTD' THEN @FirstDatetc 
     ELSE DateAdd(blah) 
    END 
AND GetDate()-1 

这是假设这是有效的语法,因为我从来没有尝试过:)

我更喜欢这个因为它很简洁 - 如果你格式化它,我想它也是很可读的

+0

试过了 - 它的工作原理! :) – Charleh 2012-08-07 20:04:19

+0

非常感谢! – user1331734 2012-08-08 12:47:54

2

这里没有必要使用CASE声明。你可以只添加附加条款上您WHERE

DECLARE @firstDayOfCurrentMonth datetime 
SET @firstDayOfCurrentMonth = CAST(CAST(YEAR(GETDATE()) AS VARCHAR(4)) + '/' + CAST(MONTH(GETDATE()) AS VARCHAR(2)) + '/01' AS DATETIME) 

SELECT DCMNumber, COUNT(*) AS PriorDenied 
FROM cauAssignedClaim 
WHERE RecordType = 'A' 
    AND [Status] IS NULL 
    AND 
    ( 
     (
      Product = 'LTD' 
      AND EntryDate BETWEEN @firstDayOfCurrentMonth AND GETDATE()-1 
     ) 
     OR 
     (
      Product = 'STD' 
      AND EntryDate BETWEEN DATEADD(Day, -7, GETDATE()-1) AND GETDATE()-1 
     ) 
    ) 

GROUP BY [Status], DCMNumber 

正如一个供参考,在这里是一个较短的方式来获得该月的第一天:

SELECT DATEADD(m,DATEDIFF(m,0,getdate()),0)