2012-02-07 173 views
1

我想创建一个报告,有表中的五个字段定义比赛。为了清理报告,我试图在报告中创建一个根据这些数据创建数据的列。澄清让我举个例子。填充字段值

当前字段:

RaceAfroAmer,RaceAmerIndian,种族种族白种人,种族西班牙,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语句和比赛场,我得到的关键字附近有语法错误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 

工作代码:

(我把种族在CASE语句的底部,并在选择语句的末尾添加'Race'=

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 
+0

有没有可能对这些领域的多个在一个记录是1?如果是这样,你是否希望将所有适用的比赛都包含在说明中,或者只是列表中的第一个? – 2012-02-07 16:03:51

+0

@ Mark否,只有其中一个值为1的行中有一个。 – rspencer 2012-02-07 16:09:50

+0

'END As Race'和'FROM'之间有逗号逗号也许您计划另一个字段? – JeffO 2012-02-07 16:46:41

回答

2

这样做会与查询的情况下,条款简单的方法:

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, 
     ... 
1

马克的回答是不错的,并保持逻辑的SQL查询。但是如果“能否直接使用SSRS编程完成?”指OP想保持这个报告,而不是在查询中,则有一对夫妇的方式,你可以把这个变成VB公式SSRS。

可以为数据集创建或者计算的字段或只使用一个公式在单元格:

=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") 

或者,你可以在单元格中创建多个占位符和改变那些基于该领域的知名度值。