我有一个表变量,我将数据转储到:
DECLARE @TmpTbl_SKUs AS TABLE
(
Vendor VARCHAR (255),
Number VARCHAR(4),
SKU VARCHAR(20),
PurchaseOrderDate DATETIME,
LastReceivedDate DATETIME,
DaysDifference INT
)
某些记录没有采购订单日期或上次收到的日期,因此天差也为空。我已经做了很多内部联接,但数据似乎花费的时间太长,或者大多数时候出现错误。
是否有可能获得每个SKU天数的平均差异?我如何检查该SKU是否只有1条记录?我需要数据,如果只有1条记录,那么我必须在平均水平上找到它。
这是结构:
供应商有很多数字,而且数字有很多SKU
任何帮助都会很棒,我似乎无法解决这个问题,也无法找到与此相关的任何内容。提前谢谢。
以下是一些示例数据:
Vendor Number SKU PurchaseOrderDate LastReceivedDate DaysDifference
OTHER PMDD 1111 OP1111 2009-08-21 00:00:00.000 2009-09-02 00:00:00.000 12
OTHER PMDD 1111 OP1112 2009-12-09 00:00:00.000 2009-12-17 00:00:00.000 8
MANTOR 3333 MA1111 2006-02-15 00:00:00.000 2006-02-23 00:00:00.000 8
MANTOR 3333 MA1112 2006-02-15 00:00:00.000 2006-02-23 00:00:00.000 8
对不起,我可能写错了。如果记录只有1个SKU,那么我想返回DaysDifference(如果它不是null),如果它有多个记录并且它们不为空,则返回平均天差。如果它全部为空,那么在供应商级别检查skus的非平均值,否则它应该返回7.这是我尝试过的:
SELECT t1.SKU, ISNULL
(
AVG(t1.DaysDifference),
(
SELECT ISNULL(AVG(t2.DaysDifference), 7)
FROM @TmpTbl_SKUs t2
WHERE t2.SKU=t1.SKU
GROUP BY t2.ChampVendor, t2.VendorNumber, t2.SKU
)
)
FROM @TmpTbl_SKUs t1
GROUP BY t1.SKU
继续玩这个。我有点拥有我所拥有的,但只是不明白我将如何检查它是否有多个记录,以及如何在供应商级别进行检查。
答案 0 :(得分:0)
试试这个:
已编辑:已添加NULLIF(..., 0)
以将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
每个SKU的 AvgDiff
与每个SKU的原始DaysDifference
相同,因为每个SKU只有一行。
现在我将DaysDifference
的{{1}}更改为0并再次运行脚本。结果是:
SKU='MA1111'
现在,MA1111的AvgDiff是4.为什么?由于SKU的平均值为0,因此按供应商计算平均值,计算结果为SKU AvgDiff
-------------------- -----------
MA1111 4
MA1112 8
OP1111 12
OP1112 8
。
下一步是将同一供应商的所有SKU的DaysDifference设置为0。在这种情况下,我将其设置为SKU MA1111和MA1112。以下是此更改脚本的结果:
(0 + 8) / 2 = 4
现在,对于MA1111和MA1112,AvgDiff为7。怎么变成这样?两者都有DaysDifference = 0.这意味着应该为每个人提供供应商的平均值。但在这种情况下,供应商平均值也是0。根据要求,此处的平均值应默认为7,这是脚本返回的内容。
因此脚本似乎正常工作。我知道,要么我错过了一些东西,要么你忘了提一些细节。无论如何,我很高兴看到这个脚本无法解决你的问题。