2

我正在尝试为该问题编写一个 PostgreSQL 查询:

2011年购买了多少产品?(2011 年购买意味着订单描述为 2011 年“已完成”)。 图表

到目前为止,我有这个查询:

    SELECT
      COUNT(product.id)
    FROM
      product
    JOIN orderitem ON 
      productid = product.id
    JOIN "order" ON 
      "order".id = orderitem.orderid AND
      EXTRACT(year FROM orderplaced) = 2011
    JOIN orderstatus ON 
      orderstatus.orderid = "order".id
    JOIN orderstatusdescription ON 
      orderstatusdescription.id = orderstatusdescriptionid AND
      orderstatusdescription.description = 'Completed';

但这会导致 231410 个产品,而数据库仅包含 1000DISTINCT(product.id)个。逻辑上使用会导致计数为 1000。

我不知道我做错了什么。

4

4 回答 4

2

来自 Andres Olarte 的稍微修改的查询:

SELECT
  COUNT(orderitem.productid)
FROM
  orderitem
JOIN "order" ON 
  "order".id = orderitem.orderid
JOIN orderstatus ON 
  orderstatus.orderid = "order".id
JOIN orderstatusdescription ON 
  orderstatusdescription.id = orderstatusdescriptionid 
WHERE 
  EXTRACT(year FROM orderplaced) = 2011
AND  orderstatusdescription.description = 'Completed';
于 2013-03-05T21:16:01.163 回答
1

您获得的数字更大,因为您有多个记录与您的一个或多个连接条件匹配。

例如,当您将product表加入时,orderitem您可能有多个orderitem匹配的记录。所以你product.id不止一次地在你的结果集中得到它。

试试COUNT(distinct product.id)——这应该会给你购买的不同产品的数量。

于 2013-03-05T21:17:19.577 回答
1

这将告诉您哪些产品是在 2011 年购买的(未经测试 - 不是在带有 PG 的计算机上):

     select distinct OI.productid, P.description
     from orderitem OI inner join products P on OI.productid=P.id
     inner join
     (   
     select order.id as orderid from order
     inner join orderstatusdescription OSD
     on order.orderstatusdescriptionid = OSD.id and OSD.description = 'COMPLETED'
     where extract(year from order.orderplaced)=2011  
     ) as Orders2011
     on Orders2011.orderid = OI.orderid
于 2013-03-05T21:18:26.397 回答
1

尝试这样的事情:

SELECT
  COUNT(product.id)
FROM
  product
JOIN orderitem ON 
  productid = product.id
JOIN "order" ON 
  "order".id = orderitem.orderid
JOIN orderstatus ON 
  orderstatus.orderid = "order".id
JOIN orderstatusdescription ON 
  orderstatusdescription.id = orderstatusdescriptionid 
WHERE 
  EXTRACT(year FROM orderplaced) = 2011
AND  orderstatusdescription.description = 'Completed';
于 2013-03-05T21:03:38.873 回答