【问题标题】:SQL - how to filter for PRODUCT_AGE less than 12 in this query. My example returns an error [closed]SQL - 如何在此查询中过滤 PRODUCT_AGE 小于 12。我的示例返回错误 [关闭]
【发布时间】:2018-08-08 14:30:09
【问题描述】:

我正在尝试获取 PRODUCT_AGE 小于 12 个月的产品组。

这是我当前的查询:

SELECT MIN(SHIP_TABLE.SHIPDATE) FIRST_SHIPPED, PRODUCT_TABLE.PRODUCT_GROUP_ID, 
DATEDIFF(MONTH,MIN(SHIP_TABLE.SHIPDATE),GETDATE()) PRODUCT_AGE 
FROM SHIP_TABLE 
LEFT JOIN PRODUCT_TABLE ON PRODUCT_TABLE.PRODUCT_ID = SHIP_TABLE.PRODUCT_ID
WHERE SHIP_TABLE.PRODUCT_ID BETWEEN '101000000' and '999999999' AND 
PRODUCT_TABLE.PRODUCT_GROUP_ID IS NOT NULL AND 
DATEDIFF(MONTH, MIN(SHIP_TABLE.SHIPDATE),GETDATE()) <= 12 
GROUP BY PRODUCT_TABLE.PRODUCT_GROUP_ID 
ORDER BY PRODUCT_TABLE.PRODUCT_GROUP_ID ASC

此查询返回一个聚合错误。

我尝试过使用子查询;但是,它也无法正常工作。

SHIP_TABLE 列出了所有产品的日期;而 PRODUCT_TABLE 列出了产品及其产品组。

我做错了什么?如何让我的查询正确过滤?

【问题讨论】:

  • 你试过什么?此外,那堵文字墙很难阅读。您需要使其易于阅读和理解。
  • 该查询在没有所需过滤器的情况下工作 - DATEDIFF(MONTH, MIN(SHIP_TABLE.SHIPDATE),GETDATE())
  • 更正,我已经按产品组 ID 确定了第一个发货日期,我试图仅筛选出产品组的首次发货日期小于 12 个月的产品。当我添加过滤器时,此查询返回并聚合错误
  • 当您拥有MIN(SHIP_TABLE.SHIPDATE) FIRST_SHIPPED 时,您是否正在尝试创建别名。这样MIN(SHIP_TABLE.SHIPDATE) 的结果将具有FIRST_SHIPPED 的列名?
  • 描述观察到的行为(包括任何确切的错误消息)以及它与预期行为有何不同。寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括期望的行为特定问题或错误以及重现它所需的最短代码问题本身。没有清晰的问题陈述的问题对其他读者没有用处。请参阅:How to create a Minimal, Complete, and Verifiable example

标签: sql reference aggregate outer-join having-clause


【解决方案1】:

当您拥有MIN(SHIP_TABLE.SHIPDATE) FIRST_SHIPPEDDATEDIFF(MONTH,MIN(SHIP_TABLE.SHIPDATE),GETDATE()) PRODUCT_AGE 时,我相信您正在尝试使用别名。这是不正确的语法。别名与as 关键字一起使用:

MIN(SHIP_TABLE.SHIPDATE) AS FIRST_SHIPPED
DATEDIFF(MONTH,MIN(SHIP_TABLE.SHIPDATE),GETDATE()) AS PRODUCT_AGE

在你的 where 子句中你有:

DATEDIFF(MONTH,  MIN(SHIP_TABLE.SHIPDATE),GETDATE()) <= 12

我相信这会导致错误;可能是您的汇总错误。您应该使用having子句。请参阅this 帖子了解更多信息。

【讨论】:

  • 谢谢,有条款是问题
猜你喜欢
  • 2014-01-26
  • 1970-01-01
  • 1970-01-01
  • 2012-01-08
  • 1970-01-01
  • 1970-01-01
  • 2023-02-11
  • 2013-03-02
  • 1970-01-01
相关资源
最近更新 更多