【问题标题】:TSQL Distinct List of departments based on current userTSQL 基于当前用户的不同部门列表
【发布时间】:2017-08-30 20:12:26
【问题描述】:

我什至想不出如何正确地表达标题。

我有一个名为multi-valued parameter 的SSRS 报告Department

如果用户 IS IN Department A..我们希望默认为除部门 A 之外的所有部门

如果用户不在 Department A..我们只想默认为他们的部门

部门 A 永远不会出现在参数列表中,但作为部门 A 的成员会影响您将看到的内容。

我知道我可以使用 ALL 参数选项解决此问题,但我希望唯一的参数值是有效的部门名称

我的参数填充了两个数据集。 第一个数据集包含三个有效部门选项:EURREMLIFA

第二个数据集仅确定当前用户的部门,并将填充默认值。 IF 当前用户的部门是CS 我们要选择其他三个部门作为默认。如果他们的部门<> CS 我们只想默认为他们的部门。

我认为下面的代码可以工作,但连接的字符串不是第一个数据集中的选项,因此它不能是默认选项

SELECT DISTINCT
    CASE
        WHEN EmployeePracticeArea = 'CS'
            THEN 'EUR, LIFA, REM'
        ELSE EmployeePracticeArea
    END AS 'EmployeePracticeArea'
FROM DimEmployee
WHERE
    (EmployeePracticeArea <> '')
    AND (UserLogin = @CurrentUser)

case 语句的问题在于它试图设置默认值EUR, LIFA, REM。此字符串不存在于“选项”值列表中。选项是三个单独的字符串EURLIFAREM

case 语句不能返回多个值,所以我需要评估当前用户的部门,然后返回一个没有它的列表

这里有一些东西会为你生成数据集

IF OBJECT_ID('tempdb..#TestData') IS NOT NULL
    DROP TABLE #TestData;


WITH Data (EmployeePracticeArea) AS (
    SELECT 'LIFA'
    UNION
    SELECT 'REM'
    UNION
    SELECT 'EUR'
    UNION
    SELECT 'CS'
)

SELECT * INTO #TestData FROM Data ;

最终结果是这样的: LIFA 部门的 User1 的参数默认为 LIFA CS部门的User2的参数默认为EUR, LIFA, REM

【问题讨论】:

  • CASE 表达式似乎写得正确 - 我不认为我理解你想要做什么......你能显示示例数据和期望的结果吗?

标签: sql-server reporting-services parameters distinct


【解决方案1】:
DECLARE @t TABLE(Dept varchar(4))
DECLARE @CurrentUserDept varchar(4) = (SELECT EmployeePracticeArea FROM dimEmployee WHERE UserLogin = @CurrentUser)

IF @CurrentUserDept = 'CS'
    BEGIN
        INSERT INTO @t VALUES ('EUR'), ('LIFA'), ('REM')
    END
ELSE
    BEGIN
        INSERT INTO @t SELECT @CurrentUserDept 
    END
SELECT * FROM @t

【讨论】:

  • 太棒了,非常感谢。我从不在我的 TSQL 中使用 IF 语句,但我必须开始
  • 很高兴我能帮上忙。我仍然在 SO 上学到了很多东西,而且我已经从事这项工作几十年了! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多