Заполните поле на основе значений других полей - PullRequest
1 голос
/ 07 февраля 2012

Я пытаюсь создать отчет, и в таблице есть пять полей, определяющих расу. Чтобы очистить отчет, я пытаюсь создать в отчете столбец, в котором данные создаются на основе этих данных. Для пояснения приведу пример.

Текущие поля:

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

Ответы [ 2 ]

2 голосов
/ 07 февраля 2012

Самый простой способ сделать это - использовать предложение 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,
       ...
1 голос
/ 07 февраля 2012

Ответ Марка хорош и сохраняет логику в запросе 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")

Или вы можете создать несколько заполнителей в ячейке и изменить видимость тех, которые основаны на значениях поля.

...