我正在尝试为此问题编写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个产品,而数据库只包含1000个。使用DISTINCT(product.id)
逻辑导致计数为1000。
我不知道我做错了什么。
答案 0 :(得分:1)
来自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';
答案 1 :(得分:0)
尝试这样的事情:
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';
答案 2 :(得分:0)
您获得了更大的数字,因为您有多个记录与一个或多个连接条件匹配。
例如,当您将product
表加入orderitem
时,您可能会有多个匹配的orderitem
记录。因此,您不止一次在结果集中获得product.id
。
尝试COUNT(distinct product.id)
- 这应该会为您提供已购买的不同产品的数量。
答案 3 :(得分:0)
这将告诉您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