1

私の目標は、承認された注文書のアイテムの記録された購入価格を取得することです。

Purchase_Ordersテーブルには、注文番号とそのステータスなど、注文のメタデータが含まれています (たとえば、承認された場合は 1、拒否された場合は 0)。

Purchase_Ord_Contentsテーブルにはコンテンツ レコードが含まれており、外部キーを介して共有インデックスの親注文書にリンクされています。order_number)

例: データベースに 2 つの注文があり、1 つは承認され、もう 1 つは拒否されました。データは次のように表されます。

 =========================================
           PURCHASE_ORDERS TABLE
 =========================================
 id   |   order_number   |   order_status
 -----------------------------------------
  1          PO_100               0
  2          PO_101               1
  3          PO_102               1

===================================================
           PURCHASE_ORD_CONTENTS TABLE
===================================================
id    | order_number | purchase_price |    sku
---------------------------------------------------
   1       PO_100           1.50          APPLE
   2       PO_100           1.50          ORANGE
   3       PO_101           2.00          APPLE
   4       PO_101           2.00          ORANGE
   5       PO_102           1.75          BANANA

クエリは行 3、4、および 5 を返す必要があります。これはPO_101、承認されたのに対し、PO_100拒否され、行 5 が特定の SKU の唯一のレコードであるだけでなく、注文も承認されたからです。私はいくつかの異なるアプローチを試みましたが、承認されていない発注書にあった部品を除外するかorder_number、最低のpurchase_price.

ここに私がこれまでに持っているものがあります(正しく機能していません)

SELECT a.*
FROM   purchase_ord_contents AS a
       JOIN (SELECT sku,
                    MIN(purchase_price) AS min_price
             FROM   purchase_ord_contents
             GROUP  BY sku) AS b
         ON ( a.sku = b.sku
              AND a.purchase_price = b.min_price )
WHERE a.order_number
IN (
   SELECT order_number
   FROM purchase_orders
   WHERE order_status != 0
)

このクエリは、テーブルからレコードを正常に返しますが、が 0 の発注書にあっpurchase_ord_contentsた最低のレコードを省略します。purchase_priceorder_status

あなたがおそらく今までに判断したように、私は「高度な」SQLクエリに精通していません。お時間をいただきありがとうございます。さらに情報を提供する必要がある場合は、お気軽にお問い合わせください。

4

2 に答える 2

1

これはあなたが探しているものかもしれません:

SELECT sku, purchase_price, order_number
FROM (
    SELECT MIN(purchase_price) AS purchase_price, sku
    FROM purchase_ord_contents
    JOIN purchase_orders USING (order_number)
    WHERE purchase_orders.order_status = 1
    GROUP BY sku
) AS min_sku_price -- this is the lowest sale price for each SKU
JOIN purchase_ord_contents USING (sku, purchase_price) -- gets all orders having sold a SKU at its lowest price
JOIN purchase_orders USING (order_number)
WHERE purchase_orders.order_status = 1

この SKU の最低価格が複数の注文で提示された場合、これは 1 つの特定の SKU に対して複数の行を返すことに注意してください。

于 2013-06-25T21:36:13.860 に答える
0

私が正しく理解していれば、あなたはこれが欲しいと思います:

SELECT po.order_number, poc.sku, min(poc.purchase_price)
FROM purchase_orders AS po
 JOIN purchase_ord_contents AS poc ON poc.order_number = po.order_number
 WHERE po.order_status != 0
 GROUP by po.order_number, poc.sku
 order by po.order_number, poc.sku
于 2013-06-25T21:20:40.817 に答える