Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 找出2012年平均标准成本最高的五个产品组(起始日期为2012年)_Sql_Sql Server 2012_Average - Fatal编程技术网

Sql 找出2012年平均标准成本最高的五个产品组(起始日期为2012年)

Sql 找出2012年平均标准成本最高的五个产品组(起始日期为2012年),sql,sql-server-2012,average,Sql,Sql Server 2012,Average,这是我想出来的,但我无法理解。得到错误的是我的子查询。请帮忙 SELECT SUBSTRING(P.Name, 1, CHARINDEX('1',P.Name)) AS ProductGroups FROM Product P JOIN ProductCostHistory PCH ON ( PCH.ProductID = P.ProductID ) WHERE ( SELECT TOP (5) AVG(PCH.StandardCost) FROM ProductCostHis

这是我想出来的,但我无法理解。得到错误的是我的子查询。请帮忙

SELECT SUBSTRING(P.Name, 1, CHARINDEX('1',P.Name)) AS ProductGroups
FROM Product P
JOIN ProductCostHistory PCH ON ( PCH.ProductID = P.ProductID )
WHERE (
    SELECT TOP (5) AVG(PCH.StandardCost) 
    FROM ProductCostHistory PCH 
    WHERE StartDate = 2012
);

不是100%清楚,但下面的内容应该可以让你接近

子查询按ProductID提取前5名的平均成本,然后将其加入到产品表中。您的子查询缺少一个GROUP BY,因此它将是所有产品的平均值,而不是按产品的平均值,它还缺少ORDER BY,因此它将给出它计算的前5个产品,而不是最高的5个

SELECT SUBSTRING(P.Name, 1, CHARINDEX('1',P.Name)) AS ProductGroups, q.ProductID,.q.AvgCost
FROM Product P
INNER JOIN (
    SELECT TOP (5) PCH.ProductID, AVG(PCH.StandardCost) As AvgCost
    FROM ProductCostHistory PCH 
    WHERE PCH.StartDate = 2012
    GROUP BY PCH.ProductID
    ORDER BY AVG(PCH.StandardCost) Desc
) As q ON (p.ProductID = q.ProductID)

当您使用SQL Server 2012时,您可以使用“按平均标准成本排序”的行数分析功能,并返回前5名产品

 With CTE as
 (
      SELECT  productid    ,
      Avg(standardcost) as avgCost,
      Row_number() over ( partition by productid order by avg(standard cost) desc) as rn
     FROM ProductCostHistory         WHERE StartDate = 2012
     Group by productid
   )
   SELECT SUBSTRING(P.Name, 1, CHARINDEX('1',P.Name)) AS      ProductGroups,
  CTE.avgCost
  FROM Product P
 JOIN Cte 
 On CTE.productid = p.productid
 And CTE.rn <= 5

嘿,伙计们,在修改Simon发布的内容后,我得到了结果!我只是想感谢所有帮助过我的人

SELECT TOP 5 (substring(P.Name, 1, CHARINDEX(' ',P.Name))) AS ProductGroups,AVG(PCH.StandardCost) AS AverageStandardCost,P.ProductID AS ProductID 
FROM Product P 
INNER JOIN ProductCostHistory PCH ON (PCH.ProductID = P.ProductID) 
WHERE PCH.StartDate 
LIKE '%2012%' 
GROUP BY P.Name, P.ProductID
ORDER BY AVG(PCH.StandardCost) DESC

如果你同意,请告诉我

你想干什么?WHERE子句没有任何作用,因为它没有谓词,只有一个表表达式。那里应该有某种表达式,其计算结果为真或假。此外,您的子查询只返回一行,因为它没有按任何内容分组,所以前5名也没有做任何事情。Mike,我如何找到标准成本最高的前5名组的平均值。这就是我真正困惑的地方。对不起,我是sql新手,所以我学习得很慢……您的StartDate列是什么类型的?是sql 2008还是sql 20082012@rdubya-时间到了。谢谢你的反馈,西蒙。我想我知道该怎么做了。我一弄明白就把答案贴出来!非常感谢你的帮助!