检查具有相同ID的DB中的记录是否在字段中具有不同的值

时间:2015-11-28 12:31:22

标签: sql hsqldb

我想检查具有相同ID(Product_ID)的记录是否具有多个具有不同日期的记录(我想检查产品是否在不同的战利品中或仅在一天内收到),所以如果它只返回一行,这意味着它在同一天被传递,如果不止一个结果返回它反过来。

表格产品

ID (PK) | Product_ID | Type | Deliver_Date | Amount

我已经尝过一个小组,并且没有结果。

编辑 :我到目前为止的查询......

    SELECT DISTINCT ,
                count(*)
FROM            PUBLIC.product
WHERE           product_id = ?
AND             deliver_date = ?
HAVING          count() = 1 

1 个答案:

答案 0 :(得分:4)

您对DISTINCT关键字的使用不正确。

您可以将DISTINCT与其后面的字段列表一起使用,告诉您要区分哪些字段,或使用COUNTSUM,{{1与分组字段一起使用。

E.g。

MIN

表示“向我提供产品ID和交付日期的所有不同组合”。这实际上并不是您所需要的,因为SELECT DISTINCT Product_Id, Deliver_date FROM ... WHERE ... 只会告诉您哪些产品ID,但不知道它们中有多少以及在哪些日期,而DISTINCT Product_id会为您提供所有可能的产品ID组合并提供日期,但您需要手动计算。

DISTINCT Product_id, Deliver_date构造提供更多信息

GROUP BY

按产品ID对行进行分组。它告诉您每个产品ID有多少行。

但是,如果您有多个具有相同产品ID和相同日期的行,该怎么办?您将在该查询中获得大于1的数字,但它不会对您有所帮助,因为您希望区分在两天内交付的产品和在同一天交付的所有产品。

为此,您需要使用SELECT count(*), Product_Id FROM ... WHERE ... GROUP BY Product_Id

COUNT(DISTINCT(Deliver_date))

这意味着:   *通过SELECT COUNT(DISTINCT(Deliver_date)), Product_ID FROM ... WHERE ... GROUP BY Product_ID 将行分成组。   *在每个此类组(具有Product_ID的所有行)内,找到所有不同的Product_ID值。计算组内有多少个Deliver_Date个值。

因此,如果产品在同一天内交付了10次,那么您只需拥有该产品ID的一个不同交货日期。 Delivery_Date将返回1.如果在第x天发送了5次,在第y天发送了5次,那么您将有两个不同的发送日期(x和y),并且COUNT将返回2.

现在,如果要删除所有在同一天交付的内容(不同日期的计数为1),则在查询中添加COUNT子句:

HAVING

这将为您提供至少在两个不同日期交付的所有产品的列表。

当然,如果您只是想检查特定产品是否在多个日期交付,则更简单:

SELECT COUNT(DISTINCT(Deliver_date)), Product_Id
FROM PRODUCT
GROUP BY Product_Id
HAVING COUNT(DISTINCT(Deliver_date)) > 1

这将为您提供此产品交付的不同天数。如果仅在一天内交付,结果将为1.如果超过一天交付,结果将是大于一的数字。

总结一下:

  • 没有SELECT COUNT(DISTINCT(Deliver_date)) FROM PRODUCT WHERE Product_ID = ? 这样的东西。 DISTINCT,后面跟着一个或多个应该是不同的字段的名称。
  • 但是有一个DISTINCT计算字段在组或结果集中有多少个不同的值。