【发布时间】:2018-01-04 21:20:04
【问题描述】:
我在 SSRS 中组合或/和语句时遇到问题。我正在使用几个参数字段,但没有任何运气。除了开始日期和结束日期外,我可以使用数据集中的查询对其他参数进行多选选择。我的问题是获得所有福利、扣除和支付代码,然后将它们限制在一个日期范围内。日期未被过滤。
SELECT
UPR30100.EMPLOYID
,UPR30100.CHEKDATE AS [UPR30100 CHEKDATE]
,UPR30100.CHEKNMBR
,UPR30100.PYADNMBR
,UPR30300.PYRLRTYP
,UPR30300.PAYROLCD
,UPR30300.CHEKDATE AS [UPR30300 CHEKDATE]
,UPR30300.UNTSTOPY
,UPR30300.PAYRATE
,UPR30300.UPRTRXAM
,UPR00100.LASTNAME
,UPR00100.FRSTNAME
,UPR00100.ADRSCODE
,UPR00100.BRTHDATE
,UPR00100.SOCSCNUM
,UPR00100.STRTDATE
,UPR00100.BENADJDATE
,UPR00100.LASTDAYWORKED_I
,UPR30100.VOIDED
,UPR30300.DAYSWRDK
,SY01200.INET1
,UPR00102.ADDRESS1
,UPR00102.ADDRESS2
,UPR00102.CITY
,UPR00102.[STATE]
,UPR00102.ZIPCODE
FROM
UPR30100
INNER JOIN UPR30300
ON UPR30100.CHEKNMBR = UPR30300.CHEKNMBR
INNER JOIN UPR00100
ON UPR30100.EMPLOYID = UPR00100.EMPLOYID
INNER JOIN UPR00102
ON UPR00100.ADRSCODE = UPR00102.ADRSCODE AND UPR00100.EMPLOYID = UPR00102.EMPLOYID
INNER JOIN SY01200
ON UPR00102.EMPLOYID = SY01200.Master_ID AND UPR00102.ADRSCODE = SY01200.ADRSCODE
WHERE UPR30300.PAYROLCD in (@Paycodes)or UPR30300.PAYROLCD in (@Benefits)or UPR30300.PAYROLCD in (@Deductions) and UPR30300.chekdate between (@Begindate) and (@Enddate)
谢谢! 迈克
【问题讨论】:
-
或许
WHERE ( ... OR... OR ...) AND ...? -
有两个问题:
in的优先级低于and,所以毕竟ands会被应用,可能带来的行数比预期的多;另一个问题是使用带有变量的in。如果变量包含一个列表,这是通过命名预期的,你应该使用动态 sql,或者,如果你使用 Sql Server 2016,使用 STRING_SPLIT 函数的子查询将列表转换为单列表。
标签: sql sql-server reporting-services parameters