【问题标题】:How to convert multiple rows into one row in SSRS?如何在SSRS中将多行转换为一行?
【发布时间】:2016-04-13 18:07:36
【问题描述】:

我的 MSSQL sql 查询显示 Employee Hierarchy 的数据,授权码如下

ManagerName     EmployeeName    AuthCode
Tim             Peter           csr2
Tim             Peter           sup
Tim             Peter           itil
Tim             Colt            csr2
Tim             Colt            sup

 SSRS 报告显示下面列出的结果,当我选择报告 parameter= Tim 时,结果只显示顶行而不显示随后的 AuthCodes 而查询显示全部

EmployeeName    AuthCode
Peter           csr2
Colt            csr2

 我希望数据显示类似(它应该连接员工的身份验证码):

EmployeeName    AuthCode
Peter           csr2, sup, itil
Colt            csr2, sup

谁能建议我在 SSRS 中需要做什么,以便数据显示所有带有逗号分隔值的身份验证码?

【问题讨论】:

标签: reporting-services pivot grouping ssrs-2008-r2


【解决方案1】:

这应该可行:

=JOIN(LOOKUPSET(Fields!EmployeeName.Value, Fields!EmployeeName.Value, Fields!AuthCode.Value, "DataSet1"), ", ")

LookupSet 根据 EmployeeName 获取所有 AuthCode。

JOIN 使用逗号分隔符将数组转换为字符串。

【讨论】:

  • +汉诺威拳头 谢谢!那行得通,但我仍然看到一些在同一员工的单元格中重复的身份验证码。我怎样才能摆脱重复?
  • 不幸的是,JOINLookupSet 都不能处理重复项。你能让你的数据与众不同吗?否则,您需要一些自定义 VB 代码来解析重复项。
【解决方案2】:

汉诺威拳头回答的一些补充:
如果您需要区分您的 join + lookupset 结果,您可以

转到报告的属性 -> Code tab

在报表属性中添加一些 VB 代码

Public Shared Function RemoveDuplicates(m_Array As Object()) As String()

    System.Array.Sort(m_Array)
    Dim k As Integer = 0
    For i As Integer = 0 To m_Array.Length - 1
        If i > 0 AndAlso m_Array(i).Equals(m_Array(i - 1)) Then
            Continue For
        End If
        m_Array(k) = m_Array(i)
        k += 1
    Next

    Dim unique As [String]() = New [String](k - 1) {}
    System.Array.Copy(m_Array, 0, unique, 0, k)
    Return unique

End Function

并编辑单元格表达式:

=JOIN( Code.RemoveDuplicates( LOOKUPSET(Fields!EmployeeName.Value, Fields!EmployeeName.Value, Fields!AuthCode.Value, "DataSet1")), ", ")

【讨论】:

    猜你喜欢
    • 2011-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多