Заменить нулевые значения в запросе предыдущим значением - PullRequest
0 голосов
/ 18 февраля 2020

Я создаю запрос через SSMS, работаю на SQL Server 2012.

Часть моего запроса - найти руководителя для сотрудников. Моя проблема в том, что для таблицы, содержащей имена супервизоров, она не создает новую ежедневную запись. Поскольку для этого дня нет записей, мой запрос отображается как NULL для супервизора.

Как заполнить эти значения NULL последним супервизором, о котором они сообщили в таблице?

Таблица супервизора

MeasureDate    Associate            Supervisor
2019-09-02     Goodman, Michelle    Moody, Robin
2019-09-01     Goodman, Michelle    Moody, Robin
2019-08-20     Goodman, Michelle    Henry, Jack
2019-08-19     Goodman, Michelle    Henry, Jack

Текущий вывод запроса

Date        Supervisor     Associate
2019-09-01  Moody, Robin   Goodman, Michelle
2019-08-21  NULL           Goodman, Michelle
2019-08-20  Henry, Jack    Goodman, Michelle

Улучшенный вывод запроса

Date        Supervisor     Associate
2019-09-01  Moody, Robin   Goodman, Michelle
2019-08-21  Henry, Jack    Goodman, Michelle
2019-08-20  Henry, Jack    Goodman, Michelle

Текущий запрос

SELECT 
z.Date,
z.Supervisor,
z.Associate,
CAST('XXX' AS char) AS [Group],
z.Task,
Sum(z.Minutes) as Minutes,
Sum(z.Count) as Cases

FROM
(
SELECT
a.DS_LOAD_DT AS Date,
c.CASE_TASK_TYPE_NM AS Task,
b.AssociateName AS Associate,
d.Supervisor,
(CONVERT(decimal,a.DURATIONSEC)/60) AS Minutes,
COUNT(*) AS Count

FROM DW_RawData_XXXDetail a
LEFT JOIN DW_Dim_AssociateMapping b ON a.XXX_EMP_ID = b.XXX_ID AND a.DS_LOAD_DT = b.ScheduleDate
LEFT JOIN DW_Dim_XXX_Case_Types c ON left(a.MSG_TYPE_CD, patindex('%[0-9][^0-9]%', a.MSG_TYPE_CD)) = 
c.CASE_TASK_TYPE_ID
LEFT JOIN OperationScoreCard_Daily_Associates d ON b.AssociateName = d.Associate AND b.ScheduleDate = 
d.MeasureDate

WHERE b.MUID = '400'
AND a.DS_LOAD_DT >= '2019-08-01'

GROUP BY
a.DS_LOAD_DT,
c.CASE_TASK_TYPE_NM,
b.AssociateName,
d.Supervisor,
(CONVERT(decimal,a.DURATIONSEC)/60)
) z

GROUP BY
z.Date,
z.Task,
z.Associate,
z.Supervisor

Ответы [ 2 ]

0 голосов
/ 18 февраля 2020

Вы можете использовать функцию запаздывания, чтобы получить предыдущее значение супервизора, используя разбиение по ассоциату. За дополнительной информацией обращайтесь: https://docs.microsoft.com/en-us/sql/t-sql/functions/lag-transact-sql?view=sql-server-ver15

Ниже приведен пример:

    CREATE TABLE LogicalConnection (
  `cpId` VARCHAR(11),
  `sequenceNumber` VARCHAR(11)
);

INSERT INTO LogicalConnection
  (`cpId`, `sequenceNumber`)
VALUES
  ('1', '10'),
  ('1', NULL),
  ('2', '20');

    SELECT t.cpId, 
    case when t.sequenceNumber is null then lag(t.sequenceNumber) over (partition by t.cpId) else t.sequenceNumber end
from LogicalConnection t
0 голосов
/ 18 февраля 2020
select top 1 '2019-08-01' as Date, Supervisor, Associate
from DW_RawData_XXXDetail --plus any joins you need
where Date <= '2019-08-01'
group by MAX(Date), Supervisor, Associate

Группировка по дает вам самую последнюю дату для каждой комбинации Supervisor / Associate, так что вы можете просто сравнить ее с любой целевой датой, которая вам нужна. Идеально заменить жестко закодированную дату на переменную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...