SSRS报告在参数使用“=”运算符但不使用“IN”时工作

时间:2017-06-26 22:16:46

标签: sql reporting-services

我会尽量保持这一点。

我在SSRS中有一个报告,其中@Position参数需要能够接受多个值(请参阅下面WHERE子句中的参数)。

DECLARE @multiplier INT;

SET @multiplier = 30

SELECT p.Fname, 
       p.Lname,
       p.Position,
       (SUM(plg.PTS)/SUM(plg.MP))*@multiplier AS PTS,
       (SUM(plg.TRB)/SUM(plg.MP))*@multiplier AS TRB,
       (SUM(plg.AST)/SUM(plg.MP))*@multiplier AS AST,
       (SUM(plg.BLK)/SUM(plg.MP))*@multiplier AS BLK,
       (SUM(plg.STL)/SUM(plg.MP))*@multiplier AS STL,      
       (SUM(plg.TOV)/SUM(plg.MP))*@multiplier AS TOV,
       (SUM(plg.FT)/SUM(plg.MP))*@multiplier AS FTs,
       --SUM(plg.FTA)/SUM(plg.MP))*@multiplier AS FTAs,
       SUM(plg.FT)/SUM(plg.FTA) AS FT_Percentage,
       (SUM(plg.FG)/SUM(plg.MP))*@multiplier AS FGs,
       --SUM(plg.FGA)/SUM(plg.MP))*@multiplier AS FGAs,
       SUM(FG)/SUM(FGA) as Field_Percentage,
       (SUM(plg.[3P])/SUM(plg.MP))*@multiplier AS Threes,
       --SUM(plg.[3PA])/SUM(plg.MP))*@multiplier AS TP%
       SUM([3P])/SUM([3PA]) AS Three_Point_Percentage
FROM PlayerGameLog plg
INNER JOIN Players p
ON p.PlayerID = plg.PlayerID
WHERE plg.PlayerID IN (SELECT PlayerID
            FROM Players
            WHERE lname != 'westbrook')
    AND p.TeamID = 'OKC'
    AND p.Position = @Position
GROUP BY p.Fname, p.Lname, p.Position
ORDER BY PTS DESC;

如果我更改以下行:

AND p.Position = @Position

要:

AND p.Position IN @Position

我收到一条消息,提示我Define Query Paramters。无论我将它们设置为什么,我都会遇到一条消息:there is an error.我已经更改了参数以允许多个值,但仍然没有骰子。有任何想法吗?

2 个答案:

答案 0 :(得分:0)

尝试使用动态SQL

像这样的东西

DECLARE @SQLString varchar(8000)
SET SQLString = 'SELECT p.Fname, 
       p.Lname,
       p.Position,
       (SUM(plg.PTS)/SUM(plg.MP))*@multiplier AS PTS,
       (SUM(plg.TRB)/SUM(plg.MP))*@multiplier AS TRB,
       (SUM(plg.AST)/SUM(plg.MP))*@multiplier AS AST,
       (SUM(plg.BLK)/SUM(plg.MP))*@multiplier AS BLK,
       (SUM(plg.STL)/SUM(plg.MP))*@multiplier AS STL,      
       (SUM(plg.TOV)/SUM(plg.MP))*@multiplier AS TOV,
       (SUM(plg.FT)/SUM(plg.MP))*@multiplier AS FTs,
       --SUM(plg.FTA)/SUM(plg.MP))*@multiplier AS FTAs,
       SUM(plg.FT)/SUM(plg.FTA) AS FT_Percentage,
       (SUM(plg.FG)/SUM(plg.MP))*@multiplier AS FGs,
       --SUM(plg.FGA)/SUM(plg.MP))*@multiplier AS FGAs,
       SUM(FG)/SUM(FGA) as Field_Percentage,
       (SUM(plg.[3P])/SUM(plg.MP))*@multiplier AS Threes,
       --SUM(plg.[3PA])/SUM(plg.MP))*@multiplier AS TP%
       SUM([3P])/SUM([3PA]) AS Three_Point_Percentage
FROM PlayerGameLog plg
INNER JOIN Players p
ON p.PlayerID = plg.PlayerID
WHERE plg.PlayerID IN (SELECT PlayerID
            FROM Players
            WHERE lname != '''westbrook''')
    AND p.TeamID = '''OKC'''
    AND p.Position IN( ' + @Position + ')
GROUP BY p.Fname, p.Lname, p.Position
ORDER BY PTS DESC;'

EXEC @SQLString

答案 1 :(得分:0)

您对SQL查询的不同部分的范围感到困惑。

考虑以下两个条款:

WHERE Position IN ('1', '2', '3')
WHERE Position IN ('1, 2, 3')

你能看到这些不相同吗?第一个是查找三个单位数值中的任何一个。第二个是查找SINGLE值,字符串长度为7个字符,有3个数字,2个空格和2个逗号。

执行Position IN @Position后,您将执行类似第二个表达式的操作。当然,问题在于字符串内容不会以某种方式发生"突破"他们的价值和成为SQL,以便他们代表三个价值观。它是一个值,它将保留一个值。

我鼓励您首先停止使用存储过程并在应用程序层中编写代码,您可以在其中编写所需的SQL语句。然后,您可以使用IN构建正确的SQL语句。或者您可以插入临时表并加入到该表中。

或者,如果绝对必须继续使用存储过程,则将@Position的内容解析为临时表或表变量。查找SQL字符串拆分。

最后,如另一个答案所述,您可以使用动态SQL,但最好避免这种情况。如果你能提供帮助,请不要去那里。我向你保证,如果你能完全避开它,那么沿着这条路走下去并不好。