Попробуйте:
РЕДАКТИРОВАНИЕ: добавлено NULLIF(..., 0)
для обработки нулей как NULL.
SELECT
t1.SKU,
COALESCE(
NULLIF(AVG(t1.DaysDifference), 0),
NULLIF(t2.AvgDifferenceVendor, 0),
7
) AS AvgDiff
FROM @TmpTbl_SKUs t1
INNER JOIN (
SELECT Vendor, AVG(DaysDifference) AS AvgDifferenceVendor
FROM @TmpTbl_SKUs
GROUP BY Vendor
) t2 ON t1.Vendor = t2.Vendor
GROUP BY t1.SKU, t2.AvgDifferenceVendor
РЕДАКТ. 2: как я тестировал скрипт.
Для тестирования я использую пример данных, размещенных с вопросом.
DECLARE @TmpTbl_SKUs AS TABLE
(
Vendor VARCHAR (255),
Number VARCHAR(4),
SKU VARCHAR(20),
PurchaseOrderDate DATETIME,
LastReceivedDate DATETIME,
DaysDifference INT
)
INSERT INTO @TmpTbl_SKUs
(Vendor, Number, SKU, PurchaseOrderDate, LastReceivedDate, DaysDifference)
SELECT 'OTHER PMDD', '1111', 'OP1111', '2009-08-21 00:00:00.000', '2009-09-02 00:00:00.000', 12
UNION ALL
SELECT 'OTHER PMDD', '1111', 'OP1112', '2009-12-09 00:00:00.000', '2009-12-17 00:00:00.000', 8
UNION ALL
SELECT 'MANTOR', '3333', 'MA1111', '2006-02-15 00:00:00.000', '2006-02-23 00:00:00.000', 8
UNION ALL
SELECT 'MANTOR', '3333', 'MA1112', '2006-02-15 00:00:00.000', '2006-02-23 00:00:00.000', 8;
Сначала я запускаю скрипт на неизмененных данных.Вот результат:
SKU AvgDiff
-------------------- -----------
MA1111 8
MA1112 8
OP1111 12
OP1112 8
AvgDiff
для каждого SKU идентичен исходному DaysDifference
для каждого SKU, потому что для каждого есть только одна строка.
Теперь яизменив DaysDifference
для SKU='MA1111'
на 0 и снова запустив скрипт.Результат:
SKU AvgDiff
-------------------- -----------
MA1111 4
MA1112 8
OP1111 12
OP1112 8
Теперь AvgDiff для MA1111 равен 4. Почему?Поскольку среднее значение для SKU равно 0, и поэтому берется среднее значение по поставщику, которое было вычислено как (0 + 8) / 2 = 4
.
Следующим шагом является установка для DaysDifference значения 0 для всех SKU одного и того же поставщика.В этом случае я устанавливаю его для SKU MA1111 и MA1112.Вот результат сценария для этого изменения:
SKU AvgDiff
-------------------- -----------
MA1111 7
MA1112 7
OP1111 12
OP1112 8
Так что теперь AvgDiff равен 7 для MA1111 и MA1112.Как это стало так?Оба имеют DaysDifference = 0. Это означает, что среднее значение по поставщику должно быть принято для каждого.Но в среднем вендор тоже равен 0.В соответствии с требованием, среднее значение здесь должно по умолчанию равняться 7, что и было возвращено сценарием.
Таким образом, сценарий, кажется, работает правильно.Я понимаю, что либо я что-то упустил, либо вы забыли упомянуть некоторые детали.В любом случае, я был бы рад увидеть, где этот скрипт не решит вашу проблему.