2

我在 SSRS 有一份报告,其中一个参数是基于一个人是否参加了面试、未能参加或没有当前反馈。

SQL如下:

SELECT 
   (C.Forename + ' ' + C.Surname) as Fullname, 
   C.NINO, 
   S.SignpostingType, ST.StakeholderDesc, S.SignpostDate, 
   (CASE WHEN S.Attended = 0 THEN 'False' ELSE 'True' END) AS Attended, 
   (CASE WHEN S.FailedToAttend = 0 THEN 'False' ELSE 'True' END) AS FailedToAttend, 
   (CASE WHEN S.Experience = '.' THEN '' ELSE S.Experience END) AS Experience  
FROM 
    Customer C 
INNER JOIN
    Signposting S on S.CustomerID = C.CustomerID 
INNER JOIN 
    Stakeholder ST on ST.StakeholderID = S.StakeholderID 
WHERE 
    (S.SignpostDate >= '2001-01-01' And S.SignpostDate <= '2015-01-01') 
    AND (S.StakeholderID in (1,2,3,4,5,6,7,52,53,55,70,71,73)) 
    --AND (S.Experience in (@Experience))
    --AND (S.SignpostingType in (@SignpostType))
    AND
       CASE @Attended   
           WHEN 0 THEN (S.Attended = 1 AND S.FailedToAttend = 0)
           WHEN 1 THEN (S.Attended = 0 AND S.FailedToAttend = 1)
           WHEN 2 THEN (S.Attended = 0 AND S.FailedToAttend = 0)
       END

问题在于最终的 AND 条件。根据@Attended我希望在查询中使用不同的列值的值。

我知道我可以在存储过程中动态地做到这一点,但我被要求编写一些将在 SSRS 中包含所有 SQL 的东西。我只是想确保在我推回之前我已经用尽了我的选择。

提前感谢您的时间和帮助。

4

2 回答 2

4

它可以通过ANDOR语句的组合来完成——这里不需要CASE

AND (
 (@Attended = 0 AND S.Attended = 1 AND S.FailedToAttend = 0) OR
 (@Attended = 1 AND S.Attended = 0 AND S.FailedToAttend = 1) OR
 (@Attended = 2 AND S.Attended = 0 AND S.FailedToAttend = 0) )
于 2014-01-17T16:42:53.600 回答
0
SELECT 
   (C.Forename + ' ' + C.Surname) as Fullname, 
   C.NINO, 
   S.SignpostingType, ST.StakeholderDesc, S.SignpostDate, 
   A.Attended, 
   A.FailedToAttend, 
   (CASE WHEN S.Experience = '.' THEN '' ELSE S.Experience END) AS Experience  
FROM 
    Customer C 
INNER JOIN
    Signposting S on S.CustomerID = C.CustomerID 
INNER JOIN 
    Stakeholder ST on ST.StakeholderID = S.StakeholderID
INNER JOIN
    (VALUES
       (0,'True' ,'False'),
       (1,'False','True' ),
       (2,'False','False')
    ) A(Code,Attended,FailedToAttend) on A.Code = @Attended
WHERE 
    (S.SignpostDate >= '2001-01-01' And S.SignpostDate <= '2015-01-01') 
    AND (S.StakeholderID in (1,2,3,4,5,6,7,52,53,55,70,71,73)) 
于 2014-01-17T16:56:43.523 回答