【问题标题】:SQL total quanity purchased by yearSQL 总采购量(按年份)
【发布时间】:2013-12-10 17:22:49
【问题描述】:

我的上一篇文章已关闭。

在 AdventureWorks2012 数据库中,我必须使用 Purchasing.PurchaseOrderDetail 表编写一个查询,并列出 2006 年期间为每种产品购买的总数量,并将总和标记为 TotatQtyPurchased。我还必须按 ProductID 分组。

这是我最近的查询

SELECT POD.ProductID, POD.ModifiedDate, 
       SUM(OrderQty) AS TotalQtyPurchased 
       FROM Purchasing.PurchaseOrderDetail POD  
       GROUP BY POD.ProductID  
       HAVING ModifiedDate = '2006'

但我收到此错误。

HAVING 子句中的“Purchasing.PurchaseOrderDetail.ModifiedDate”列无效,因为它既不包含在聚合函数也不包含在 GROUP BY 子句中。

这很令人沮丧。

更新:当我尝试为我的查询指定日期“2006”时,每当我输入以下命令时,我总是得到一个空白执行(即没有行或列):

WHERE ModifiedDate LIKE '2006%' 或者 WHERE ModifiedDate = '2006'

【问题讨论】:

  • 错误信息很清楚。您必须在列列表中包含POD.ModifiedDate,因为它不是聚合列的一部分(通过SUMAVGMINMAX 获得)。在此处搜索确切的错误消息“Column is invalid in the having 子句”会发现许多示例和有关如何修复它的说明。您应该始终做的第一件事是搜索错误消息;很有可能你不是第一个看到它的人(或在这里询问)。
  • 当您使用聚合函数 (Sum) 进行查询时,您需要对返回的每个字段进行“分组”,除非它也是聚合函数。所以你也需要按 ModifiedDate 分组,看起来像
  • 次要问题,但您确定要使用 ModifiedDate,而不是 OrderDate 或 ShipDate?
  • 我想使用 OrderDate

标签: sql sql-server group-by


【解决方案1】:

您已经很接近了,大多数 SQL 错误消息都会准确地告诉您错误是什么,需要一些练习来解释它们。

  • 暂时去掉 HAVING 子句...

  • 对 WHERE 子句做一些研究,弄清楚 WHERE 是如何实现的
    可以用来代替 HAVING...

由于这是作业,我不想给你答案,但这应该是正确的方向

【讨论】:

    【解决方案2】:

    如果你在Having Clause中使用任何东西,你需要使用aggreagte函数。例如, 你可以这样使用

    HAVING MAX(MODIFIEDDATE) = '2006'
    

    但是从你的问题看来,WHERE 子句最能解决你的问题。如果上面的查询结果集是你需要的,那么,

    SELECT POD.ProductID, MODIFIEDDATE, SUM(OrderQty) AS TotalQtyPurchased 
           FROM Purchasing.PurchaseOrderDetail POD  
           WHERE ModifiedDate = '2006'
           GROUP BY POD.ProductID, MODIFIEDDATE 
    

    我进行了编辑,我的建议是,由于您在 WHERE 子句中使用修改日期,因此无需在 SELECT 子句中指定。

    【讨论】:

    • 我不断收到此错误消息:选择列表中的“Purchasing.PurchaseOrderDetail.ModifiedDate”列无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。在一个有点相关的问题上,我做了一个类似的查询并成功执行它: SELECT POD.ProductID, POD.ModifiedDate, SUM(OrderQty) AS TotalQtyPurchased FROM Purchasing.PurchaseOrderDetail POD GROUP BY POD.ProductID, POD.ModifiedDate ORDER BY ModifiedDate升序
    • 会给出同样的错误,因为你在 select 语句中仍然有 ModifiedDate 而不是 group by
    • @sgmoore 谢谢忽略了这一点。现在修改
    • 谢谢。现在查询成功,但我只想返回 2006 年的日期并排除 2005、2007 和 2008 年。 SELECT POD.ProductID, POD.ModifiedDate, SUM(OrderQty) AS TotalQtyPurchased FROM Purchasing.PurchaseOrderDetail POD GROUP BY POD.ProductID, POD.ModifiedDate HAVING MAX(MODIFIEDDATE) = '2006'
    • 您需要了解wherehaving 之间的区别。您最新的查询正在做的是将每个产品/日期(无论年份)的数量相加,然后选择那些在 2006 年最后一次修改的产品。Santhosh 的查询正确地选择了那些在 2006 年之前修改过的产品> 分组和求和。
    【解决方案3】:

    现已编辑

    试试这个

    SELECT POD.ProductID, POD.ModifiedDate, SUM(Order_qty)
    AS TotalQtyPurchased FROM Purchasing.PurchaseOrderDetail  POD  where ModifiedDate = '2006' GROUP BY 
    POD.ProductID
    

    【讨论】:

    • 没用。消息 208,级别 16,状态 1,第 1 行无效的对象名称“PurchaseOrderDetail”。
    猜你喜欢
    • 2021-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-06
    • 2018-09-05
    相关资源
    最近更新 更多