2013-03-05 185 views
1

我正在尝试为该问题编写PostgreSQL查询:SQL查询给出的结果太多

2011年有多少产品被购买? (2011年买入意味着订单描述在2011年完成)。 diagram

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

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

我计数不知道我做错了什么。

+1

如果只有1个orderstatus“已完成”,我会说这是关于正确的,那许多独立的产品ID都在订单中。如果'SUM(金额)'可以得到销售物品的总数,那么你可以计算(DISTINCT product.id)'你得到的独特产品的数量是多少? – Wrikken 2013-03-05 20:32:00

+0

当然你应该加入order.id = orderitem.id而不是orderid? – Byron 2013-03-05 20:33:49

+0

这不是你的问题的原因,但你应该将'EXTRACT(year FROM orderplaced)= 2011'和'orderstatusdescription.description ='Completed''移到WHERE子句中,因为它不是连接逻辑的一部分。 – 2013-03-05 20:41:41

回答

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'; 
+0

谢谢你的回答,但仍然是相同的结果。 – Joren 2013-03-05 21:06:55

1

从安德烈斯奥拉特稍加修改查询:

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'; 
+0

仍然没有工作 – Joren 2013-03-05 21:19:05

+0

@Joren你期望查询返回什么? – 2013-03-05 21:26:36

+0

我期待一个整数范围在0 .. 1000 – Joren 2013-03-05 21:32:38

0

你得到一个较大的数字,因为你有多个记录是匹配的一个或多个的你加入条件。

例如,当您将product表加入orderitem时,可能会有多个orderitem记录匹配。因此,您不止一次在结果集中获得product.id

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

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