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

ただし、データベースには 1000 個しか含まれていないのに、これにより 231410 個の製品が生成されます。logically を使用DISTINCT(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

次のようなものを試してください。

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 に答える
1

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 に答える