Tsql 如何查找特定记录的平均值T-SQL

Tsql 如何查找特定记录的平均值T-SQL,tsql,join,average,Tsql,Join,Average,我有一个将数据转储到的表变量: DECLARE @TmpTbl_SKUs AS TABLE ( Vendor VARCHAR (255), Number VARCHAR(4), SKU VARCHAR(20), PurchaseOrderDate DATETIME, LastReceivedDate DATETIME, DaysDifference INT ) 有些记录没有采购订单日期或上次收到日期,因此天数差异也为空。我自己做了很多内部连接,

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

DECLARE @TmpTbl_SKUs AS TABLE
(
    Vendor VARCHAR  (255),
    Number VARCHAR(4),
    SKU VARCHAR(20),
    PurchaseOrderDate DATETIME,
    LastReceivedDate DATETIME,
    DaysDifference INT
)
有些记录没有采购订单日期或上次收到日期,因此天数差异也为空。我自己做了很多内部连接,但是数据似乎花费了太长时间,或者大部分时间都不正确

是否有可能获得每个SKU天数的平均差异?如何检查该SKU是否只有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),如果它有多个记录并且它们不为null,那么返回平均天数差异。如果全部为空,则在供应商级别检查不为空的SKU的平均值,否则只应返回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
继续玩这个。我有些了解我所得到的,但我不知道如何检查它是否有多个记录,以及如何在供应商级别进行检查。

尝试以下方法:

编辑:添加了
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只有一行

现在我将
SKU='MA1111'
DaysDifference
更改为0,并再次运行脚本。结果是:

SKU                  AvgDiff
-------------------- -----------
MA1111               4
MA1112               8
OP1111               12
OP1112               8
现在MA1111的AvgDiff为4。为什么?因为SKU的平均值为0,所以采用供应商的平均值,计算结果为
(0+8)/2=4

下一步是将同一供应商的所有SKU的DaysDifference设置为0。在本例中,我将其设置为SKU MA1111和MA1112。以下是此更改的脚本结果:

SKU                  AvgDiff
-------------------- -----------
MA1111               7
MA1112               7
OP1111               12
OP1112               8
现在MA1111和MA1112的AvgDiff都是7。怎么会这样呢?两者的日差均为0。这意味着每个供应商的平均值都应该取。但在这种情况下,供应商平均值也为0。根据需求,这里的平均值应该默认为7,这是脚本返回的值


因此,脚本似乎工作正常。我知道不是我错过了什么,就是你忘了提一些细节。在任何情况下,我都很高兴看到这个脚本无法解决您的问题。

我并不真正理解您的描述文本。你能提供一些行的样本数据和期望的结果吗?同时,你能给出你解决这个问题的尝试吗?所以我们没有试图为您提供不适合您的解决方案。或者我们可以看看能做些什么来改进你的。对不起。我写错了一部分。我希望这更有意义。我的查询有时会失败,因为它返回了太多的记录,无法检索。我快发疯了。那你为什么不想用分组方式呢?我刚刚更新了。哇,我太累了。我确实想要一组。我有另一个解决办法,只是时间太长了。不太确定是否有更好的方法。这没有考虑到天数差为0的情况,也没有得到供应商级别的平均值。我可以玩这个,联合,以前没有用过。谢谢。@pqsk:内部联接的子选择将计算供应商级别的平均值,然后该值将包含在COALESCE中。COALESCE基本上是一个扩展的ISNULL。它可以包含多个参数。如果第一个参数不为NULL,则返回该参数,否则函数将查看第二个参数,如果不为NULL,则返回该参数,否则将考虑第三个参数,依此类推。我认为可以用NULLIF修改0差异(在某种程度上与ISNULL相反:如果arg1=arg2,则返回NULL)。现在请看一看。是的,我看到现在正在使用0,但当daysdiff有0时,它仍然没有在供应商级别执行此操作。我想出的那个很好用,但花了很长时间。更奇怪的是,当我将它放入SP时,它只是挂起,从不插入。但如果我将其设置为仅在查询中选择,它将正确显示记录。我在这里被难住了。@pqsk:我无法找出脚本有什么问题。我正在发布我的测试结果,请看一下,也许我测试的方法不对。不,它不起作用。你很难得到结果。问题是我不能发布太多。这是敏感数据,即使我屏蔽了它。我想出了一个有效的解决办法。谢谢你。