У меня есть 7 имен метрик, и в идеале все эти метрики должны обновляться каждый месяц, но иногда этого не происходит. В этом случае я должен перенести значение моего предыдущего месяца, красный порог и желтый порог. Все данные поступают из Excel.
Создал следующий запрос на sql-сервере-
select
withnull.[Metric Name],
ISNULL(withnull.[Metric Value], withnullx.[Metric Value]) MetricValue,
ISNULL(withnull.[Red Threshold], withnullx.[Red Threshold]) Red,
ISNULL(withnull.[Yellow Threshold], withnullx.[Yellow Threshold]) Yellow,
withnull.[Date]
from
(
SELECT [Metric Value], [Red Threshold], [Yellow Threshold], Mon.[Date], Mon.[Metric Name]
FROM
(
SELECT [Metric Name], [Last Updated Date], [Metric Value], [Red Threshold], [Yellow Threshold]
FROM [QMS Scorecard].[dbo].['#1 Effectiveness (SPC)$']
UNION ALL
SELECT [Metric Name], [Last Updated Date], [Metric Value], [Red Threshold], [Yellow Threshold]
FROM [QMS Scorecard].[dbo].['#1 MRB Effectiveness (Non-Conf)$']
UNION ALL
SELECT [Metric Name], [Last Updated Date], [Metric Value], [Red Threshold], [Yellow Threshold]
FROM [QMS Scorecard].[dbo].['#1 Effectiveness(Problem Solvi)$']
UNION ALL
SELECT [Metric Name], [Last Updated Date], [Metric Value], [Red Threshold], [Yellow Threshold]
FROM [QMS Scorecard].[dbo].['Calibration Passing "As Found" $']
UNION ALL
SELECT [Metric Name], [Last Updated Date], [Metric Value], [Red Threshold], [Yellow Threshold]
FROM [QMS Scorecard].[dbo].['Change Control Malfunction Rate$']
UNION ALL
SELECT [Metric Name], [Last Updated Date], [Metric Value], [Red Threshold], [Yellow Threshold]
FROM [QMS Scorecard].[dbo].['MSA passing rate$']
UNION ALL
SELECT [Metric Name], [Last Updated Date], [Metric Value], [Red Threshold], [Yellow Threshold]
FROM [QMS Scorecard].[dbo].['Unknown Failures (FMEA & Ctrl)$']
) Data
RIGHT JOIN
(
SELECT [Date], [Metric Name]
FROM [Dates$]
--ORDER BY [Metric Name], [Date]
) Mon
ON datepart(mm, Data.[Last Updated Date]) = datepart(mm, Mon.[Date])
AND
datepart(yyyy, Data.[Last Updated Date]) = datepart(yyyy, Mon.[Date])
AND
Data.[Metric Name] = Mon.[Metric Name]
--ORDER BY [Metric Name], [Date]
) withnull
outer apply
(SELECT [Metric Value], [Red Threshold], [Yellow Threshold]
FROM (SELECT * from (SELECT *, row_number() OVER (PARTITION BY [Metric Name] ORDER BY [Date] DESC) rn from
(
SELECT [Metric Value], [Red Threshold], [Yellow Threshold], Mon.[Date], Mon.[Metric Name]
FROM
(
SELECT [Metric Name], [Last Updated Date], [Metric Value], [Red Threshold], [Yellow Threshold]
FROM [QMS Scorecard].[dbo].['#1 Effectiveness (SPC)$']
UNION ALL
SELECT [Metric Name], [Last Updated Date], [Metric Value], [Red Threshold], [Yellow Threshold]
FROM [QMS Scorecard].[dbo].['#1 MRB Effectiveness (Non-Conf)$']
UNION ALL
SELECT [Metric Name], [Last Updated Date], [Metric Value], [Red Threshold], [Yellow Threshold]
FROM [QMS Scorecard].[dbo].['#1 Effectiveness(Problem Solvi)$']
UNION ALL
SELECT [Metric Name], [Last Updated Date], [Metric Value], [Red Threshold], [Yellow Threshold]
FROM [QMS Scorecard].[dbo].['Calibration Passing "As Found" $']
UNION ALL
SELECT [Metric Name], [Last Updated Date], [Metric Value], [Red Threshold], [Yellow Threshold]
FROM [QMS Scorecard].[dbo].['Change Control Malfunction Rate$']
UNION ALL
SELECT [Metric Name], [Last Updated Date], [Metric Value], [Red Threshold], [Yellow Threshold]
FROM [QMS Scorecard].[dbo].['MSA passing rate$']
UNION ALL
SELECT [Metric Name], [Last Updated Date], [Metric Value], [Red Threshold], [Yellow Threshold]
FROM [QMS Scorecard].[dbo].['Unknown Failures (FMEA & Ctrl)$']
) Data
RIGHT JOIN
(
SELECT [Date], [Metric Name]
FROM [Dates$]
) Mon
ON datepart(mm, Data.[Last Updated Date]) = datepart(mm, Mon.[Date])
AND
datepart(yyyy, Data.[Last Updated Date]) = datepart(yyyy, Mon.[Date])
AND
Data.[Metric Name] = Mon.[Metric Name]
) b ) d
WHERE rn = 1) c
WHERE
c.[Date]<withnull.[Date] and
withnull.[Metric Value] is null and
c.[Metric Value] is not null and
c.[Red Threshold] is not null and
c.[Yellow Threshold] is not null
ORDER BY [Metric Name], [Date] DESC
) withnullx
Я присоединился к рабочему листу для всех метрик, используя UNION ALL, и чтобы у меня было все месяцы для каждого имени метрики, я сделал правильное объединение.
Теперь у меня есть нулевые значения (значение метрики, красный порог, желтый порог) для месяцев без записей для этих конкретных имен метрик.
С помощью Outer Apply я заменяю эти NULL на значения предыдущего месяца. Для этого требуется ORDER BY во второй последней строке кода выше.
В приведенном выше коде есть еще один Order BY.
«SELECT * from (SELECT *, row_number () OVER (PARTITION BY [Имя метрики] ORDER BY [Date] DESC) rn»
Это помогает мне получить не только вершину за полные данные, но и вершину за каждое имя метрики.
Я надеюсь, что если бы я мог использовать этот код, я смогу заменить значения NULL на значения предыдущего месяца для каждого имени метрики. Но я получаю сообщение об ошибке: «Предложение ORDER BY недопустимо в представлениях, встроенных функциях, производных таблицах, подзапросах и выражениях общих таблиц, если также не указаны TOP, OFFSET или FOR XML». Заранее спасибо.