【问题标题】:Populate field based on other fields values根据其他字段值填充字段
【发布时间】:2012-02-07 15:51:48
【问题描述】:

我正在尝试创建一个报告,并且表格中有五个字段用于定义种族。为了清理报告,我尝试在报告中创建一个列,该列基于这些数据创建数据。为了澄清,让我举个例子。

当前字段:

RaceAfroAmer、RaceAmerIndian、Race Caucasion、Race Hispanic、RaceOriental

每个字段都填充 1 或 0

在报告中,我们需要一个基于这些字段的值填充的比赛列,即

比赛

如果这 5 个字段中的任何一个的值等于 1,则该值等于该字段名称(如果 RaceAfroAmer = 1,则该行的种族列填充 RaceAfroAmer,否则它会检查下一个字段等)。

这是否需要创建一个自动填充 Race 字段的新表,然后我们从该表中提取竞赛值?可以直接用SSRS编程吗?

为了进一步澄清这一点,我将在报告的完整原始查询下方插入,本质上我要做的就是获取这个确切的查询并添加一个种族列。

WITH HR_CTE (seq, EmployeeId, Name, JobTitle, EffectiveDate, SocSecNbr, State, DateOfBirth, DateHired, SalaryType, CpnyId)
AS
(SELECT ROW_NUMBER() OVER(PARTITION BY E.[EmployeeId] ORDER BY J.EffectiveDate DESC) AS seq,
E.EmployeeID, E.Name, J.JobTitle, J.EffectiveDate, E.SocSecNbr, E.State, E.DateOfBirth, E.DateHired, S.SalaryType, E.CpnyId
FROM XHR_Employee E
JOIN XHR_JobHistory J
    ON E.[EmployeeId] = J.[EmpId]
JOIN XHR_SalaryHist S
    ON E.[EmployeeId] = S.[EmpId])

SELECT EmployeeID, Name, JobTitle, EffectiveDate, SocSecNbr, State, DateOfBirth, DateHired, SalaryType, CpnyId
FROM HR_CTE
WHERE seq = 1
AND (CpnyID IN (@CpnyID))
AND (JobTitle IN (@JobTitle))
AND (SalaryType IN (@SalaryType))
ORDER BY Name

当我将其更改为包含 case 语句和 Race 字段时,我在关键字 FROM 附近遇到语法错误

WITH HR_CTE (seq, EmployeeId, Name, JobTitle, EffectiveDate, SocSecNbr, State, DateOfBirth, DateHired, SalaryType, CpnyId, RaceAfroAmer, RaceAmerIndian, RaceCaucasian, RaceHispanic, RaceOriental, RaceOther01, RaceOther02)
AS
(SELECT ROW_NUMBER() OVER(PARTITION BY E.[EmployeeId] ORDER BY J.EffectiveDate DESC) AS seq,
E.EmployeeID, E.Name, JobTitle, J.EffectiveDate, E.SocSecNbr, E.State, E.DateOfBirth, E.DateHired, S.SalaryType, E.CpnyId, E.RaceAfroAmer, E.RaceAmerIndian, E.RaceCaucasian, E.RaceHispanic, E.RaceOriental, E.RaceOther01, E.RaceOther02
FROM XHR_Employee E
JOIN XHR_JobHistory J
    ON E.[EmployeeId] = J.[EmpId]
JOIN XHR_SalaryHist S
    ON E.[EmployeeId] = S.[EmpId])

SELECT EmployeeID, Name, JobTitle, EffectiveDate, SocSecNbr, State, DateOfBirth, DateHired, SalaryType, CpnyId, 
CASE
    WHEN RaceAfroAmer = 1 THEN 'Black/African American'
    WHEN RaceAmerIndian = 1 THEN 'American Indian/Alaska Native'
    WHEN RaceCaucasian = 1 THEN 'White'
    WHEN RaceHispanic = 1 THEN 'Hispanic/Latino'
    WHEN RaceOriental = 1 THEN 'Asian'
    WHEN RaceOther01 = 1 THEN 'Native Hawaii/Pacific Islander'
    WHEN RaceOther02 = 1 THEN 'Two Or More Races'
END AS Race,
FROM HR_CTE
WHERE seq = 1
ORDER BY Name

工作代码:

(我将 AS Race 从 CASE 语句的底部取出,并将 'Race'= 添加到 select 语句的末尾。

WITH HR_CTE (seq, EmployeeId, Name, JobTitle, EffectiveDate, SocSecNbr, State, DateOfBirth, DateHired, SalaryType, CpnyId, RaceAfroAmer, RaceAmerIndian, RaceCaucasian, RaceHispanic, RaceOriental, RaceOther01, RaceOther02)
AS
(SELECT ROW_NUMBER() OVER(PARTITION BY E.[EmployeeId] ORDER BY J.EffectiveDate DESC) AS seq,
E.EmployeeID, E.Name, JobTitle, J.EffectiveDate, E.SocSecNbr, E.State, E.DateOfBirth, E.DateHired, S.SalaryType, E.CpnyId, E.RaceAfroAmer, E.RaceAmerIndian, E.RaceCaucasian, E.RaceHispanic, E.RaceOriental, E.RaceOther01, E.RaceOther02
FROM XHR_Employee E
JOIN XHR_JobHistory J
    ON E.[EmployeeId] = J.[EmpId]
JOIN XHR_SalaryHist S
    ON E.[EmployeeId] = S.[EmpId])

SELECT EmployeeID, Name, JobTitle, EffectiveDate, SocSecNbr, State, DateOfBirth, DateHired, SalaryType, CpnyId, 'Race'=
CASE
    WHEN RaceAfroAmer = 1 THEN 'Black/African American'
    WHEN RaceAmerIndian = 1 THEN 'American Indian/Alaska Native'
    WHEN RaceCaucasian = 1 THEN 'White'
    WHEN RaceHispanic = 1 THEN 'Hispanic/Latino'
    WHEN RaceOriental = 1 THEN 'Asian'
    WHEN RaceOther01 = 1 THEN 'Native Hawaii/Pacific Islander'
    WHEN RaceOther02 = 1 THEN 'Two Or More Races'
END
FROM HR_CTE
WHERE seq = 1
ORDER BY Name

【问题讨论】:

  • 在一条记录中是否有可能多个字段为 1?如果是这样,您希望所有适用的种族都包含在说明中,还是仅包含在列表中的第一个?
  • @Mark 否,对于任何值为 1 的行,这些字段中只有一个。
  • 你在“END As Race”和“FROM”之间有一个不必要的逗号,也许你打算有另一个字段?
  • @JeffO 我在有和没有 , 的情况下都试过了,但仍然收到错误。我确实让它工作了,请参阅上面的工作代码。

标签: sql-server reporting-services report


【解决方案1】:

最简单的方法是在查询中使用 case 子句:

select ...
       case
           when RaceAfroAmer = 1 then 'RaceAfroAmer'
           when RaceAmerIndian = 1 then 'RaceAmerIndian'
           when RaceCaucasion = 1 then 'RaceCaucasion'
           when RaceHispanic = 1 then 'RaceHispanic'
           when RaceOriental = 1 then 'RaceOriental'
       end as RaceDescription,
       ...

【讨论】:

    【解决方案2】:

    Mark 的回答很好,并且保留了 SQL 查询中的逻辑。但是万一“可以直接用SSRS编程来完成吗?”意味着 OP 希望将其保留在报告中而不是查询中,那么您可以通过多种方式将其放入 SSRS 的 VB 公式中。

    您可以为数据集创建计算字段,也可以只在单元格中使用公式:

    =SWITCH(
     Fields!RaceAfroAmer.Value = 1, "RaceAfroAmer",
     Fields!RaceAmerIndian.Value = 1, "RaceAmerIndian",
     Fields!RaceCaucasion.Value = 1, "RaceCaucasion",
     Fields!RaceHispanic.Value = 1, "'RaceHispanic",
     Fields!RaceOriental.Value = 1, "RaceOriental")
    

    或者,您可以在一个单元格中创建多个占位符,并根据字段值更改这些占位符的可见性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-09
      • 1970-01-01
      • 2021-05-12
      • 2011-01-20
      • 2012-06-26
      • 1970-01-01
      • 1970-01-01
      • 2015-05-26
      相关资源
      最近更新 更多