Reputation: 167
Here's a SQL query that works absolutely fine:
DECLARE @IncludePTO AS CHAR
SET @IncludePTO = 'Y'
SELECT
HQCO.HQCo, HQCO.Name, PREH.PRDept, PREH.Craft, HRRM.PositionCode, PRTH.Employee,
PREH.LastName, PREH.FirstName, SUM(PRTH.Hours) AS Hrs
FROM PREH
INNER JOIN HRRM ON PREH.PRCo = HRRM.HRCo AND PREH.Employee = HRRM.HRRef
INNER JOIN PRTH ON PREH.PRCo = PRTH.PRCo AND PREH.Employee = PRTH.Employee
INNER JOIN HQCO ON PRTH.PRCo = HQCO.HQCo
WHERE
(dbo.PRTH.PREndDate BETWEEN '1/1/2012 00:00:00' AND '1/1/2013 00:00:00')
AND (PRGroup = 2)
AND dbo.PRTH.EarnCode IN (1,3,8)
GROUP BY
HQCO.HQCo, HQCO.Name, PREH.PRDept, PREH.Craft,
HRRM.PositionCode, PRTH.Employee, PREH.LastName, PREH.FirstName
But, I am trying to use an 'IN' predicate coupled with the CASE WHEN in the WHERE clause.. Have a look at the modified query below:
DECLARE @IncludePTO AS CHAR
SET @IncludePTO = 'Y'
SELECT
HQCO.HQCo, HQCO.Name, PREH.PRDept, PREH.Craft, HRRM.PositionCode, PRTH.Employee,
PREH.LastName, PREH.FirstName, SUM(PRTH.Hours) AS Hrs
FROM PREH
INNER JOIN HRRM ON PREH.PRCo = HRRM.HRCo AND PREH.Employee = HRRM.HRRef
INNER JOIN PRTH ON PREH.PRCo = PRTH.PRCo AND PREH.Employee = PRTH.Employee
INNER JOIN HQCO ON PRTH.PRCo = HQCO.HQCo
WHERE
(dbo.PRTH.PREndDate BETWEEN '1/1/2012 00:00:00' AND '1/1/2013 00:00:00')
AND (PRTH.PRGroup = 2)
AND
CASE WHEN @IncludePTO = 'Y' THEN dbo.PRTH.EarnCode IN (1,2,3,8,100,110,120,115)
ELSE dbo.PRTH.EarnCode IN (1,2,3,8)
END
GROUP BY
HQCO.HQCo, HQCO.Name, PREH.PRDept, PREH.Craft, HRRM.PositionCode, PRTH.Employee,
PREH.LastName, PREH.FirstName
It doesn't seem to work and keeps giving me a syntax error:
Msg 156, Level 15, State 1, Line 15
Incorrect syntax near the keyword 'IN'.
Any help or guidance in pointing out what I'm missing? I would really appreciate any help/tips.. Thanks much,
Pranav
Upvotes: 1
Views: 1811
Reputation: 1269623
You are correct. The syntax is not allowed. You can try:
((@IncludePTO = 'Y' and dbo.PRTH.EarnCode IN (1,2,3,8,100,110,120,115)) or
(@IncludePTO <> 'Y' and dbo.PRTH.EarnCode IN (1,2,3,8))
)
This can be simplified to:
(bo.PRTH.EarnCode IN (1,2,3,8) or (@IncludePTO <> 'Y' and dbo.PRTH.EarnCode IN (100,110,120,115))
)
This assumes that @IncludePTO is never NULL. If so, then that would have to be part of the test.
If you really want case statement in the where
clause, you can do:
(CASE WHEN @IncludePTO = 'Y' and dbo.PRTH.EarnCode IN (1,2,3,8,100,110,120,115)
then 'true'
when @IncludePTO <> 'Y' and dbo.PRTH.EarnCode IN (1,2,3,8)
then 'true'
else 'false'
end) = 'true'
Upvotes: 3