如何查找某些记录的平均值T-SQL

时间:2011-02-07 15:52:06

标签: tsql join average

我有一个表变量,我将数据转储到:

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

继续玩这个。我有点拥有我所拥有的,但只是不明白我将如何检查它是否有多个记录,以及如何在供应商级别进行检查。

1 个答案:

答案 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,这是脚本返回的内容。

因此脚本似乎正常工作。我知道,要么我错过了一些东西,要么你忘了提一些细节。无论如何,我很高兴看到这个脚本无法解决你的问题。