2016-12-12 9 views
2

これは私の最初の投稿で、Stack Overflowに感謝します。将来の質問をより良くするために肯定的な批判があります。複数のサブクエリに基づいてIDを選択する

質問:私はその中に上位8項目のみを持つすべての注文を集めるSelectクエリを作成しようとしています。動作しません

私はMS-Accessで働いている2013年

私の現在のクエリは、次のようになります。

SELECT OrderID 
From DirectOrders 
WHERE OrderID <> ANY 
(
    SELECT OrderID 
    FROM DirectOrders 
    WHERE SKU <> ANY 
    (
     SELECT TOP 8 SKU 
     FROM DirectOrders 
     GROUP BY SKU 
     ORDER BY COUNT(SKU) DESC 
    ) 
) 

下記の単一の表。

OrderID Customer SKU Qty 
177622 CustomerA 1001 20 
177622 CustomerA 1002 2 
177624 CustomerB 1001 200 
177626 CustomerC 1003 50 
177626 CustomerC 1004 150 
177630 CustomerC 1005 1000 
177632 CustomerA 1006 1 
177632 CustomerA 1007 3 
177632 CustomerA 1008 9 
177632 CustomerA 1009 1 
177632 CustomerA 1010 4 
177632 CustomerA 1011 3 
177634 CustomerC 1012 5 
177634 CustomerC 1013 5 
177640 CustomerD 1014 4 
177642 CustomerA 1015 4 
177642 CustomerA 1016 48 
177642 CustomerA 1017 15 
177644 CustomerB 1018 50 

ここでは私が達成しようとしていたフローがありました。

  1. 選択トップ8 SKUのカウントによって
  2. リストで選択した受注年代の一部ではないすべての受注年代を選択し、それらの8 SKUの
  3. の1を持っていないすべての受注年代を選択します。2.
+0

*トップ8 SKUを数えます。*何をカウントしますか? – Rahul

+0

トップオーダーからの注文を数量で選択しますか?私はそれがあなたのステップ1を得ると思います。 – happymacarts

+0

結果が奇妙に見えるサンプルデータなので、SKUのカウントになります。 SKUは何百回も繰り返されます。 –

答えて

1

私は集計でこれを行うだろう:

SELECT do.OrderID 
FROM DirectOrders as do LEFT JOIN 
    (SELECT TOP 8 SKU 
     FROM DirectOrders 
     GROUP BY SKU 
     ORDER BY COUNT(SKU) DESC, SKU 
    ) as s8 
    ON do.SKU = s8.SKU 
GROUP BY do.OrderId 
HAVING COUNT(*) = COUNT(s8.SKU); 

注:MSアクセス、TOP

  • が本当にTOP WITH TIESです。 を正確に 8値にするには、タイブレーカーが必要です。このクエリはその目的でSKUを使用します。
  • LEFT JOINは、注文の各項目と上位8項目が一致するかどうかを判断します。
  • HAVING句の意味は次のとおりです。項目のある行の数は、上位8の1つと一致する行の数と同じです。したがって、すべてが順番に並んでいます。
+0

これは間違いなくより洗練された解決策ですが、私は自分の答えでやったのと同じ警告を加えて、あなたが得るトップ8を作るために 'SKU'に加えて、総量のための 'SUM(QTY)'や最新の注文の 'MAX(ORDERID)'のような任意のsku番号よりも関連性があります。 – Kateract

+0

これは完璧です。明確な答えをありがとう。私はこれで受け取ったすべての助けに感謝します。列全体を選択したい場合は、次のことをお勧めしますか?私は各列を指定しますが、その間にアスタリスクで実行します。 –

+0

はCOUNT(SKU)DESC、SUM(BY DirectOrders GROUP BY SKU ORDER QTYのトップ8 SKU を選択(LEFTが のJOINないようDirectOrders FROM DirectOrders 受注コード= ANY ( SELECT do.OrderID * FROM を選択します)DESC、MAXとしてdo.OrderId HAVING COUNT(*)= COUNT(s8.SKU) )BY do.SKU = s8.SKU GROUP ON S8(ORDERID)DESC、SKU )。 –

0

私はこのようなものが必要だと思います。ただし、他のSKUの数が1001以外は1であるため、カウントSKUを使用している場合は、奇妙な結果が得られる可能性があります.1001を除いて、他のSKUはすべてカウント(SKU)を基準にして上位8にあります。

SELECT * from DirectOrderswhere SKU (SKU順のSKU順のDirectOrdersグループからトップ8 SKUを選択);

+0

私は、TOP 8の一部ではないSKUの注文を含まないようにしています。最終結果は、TOP 8が存在する注文全体(OrderID)のみを表示します。 –

+0

これは私が探しているものに近いです。しかし、私はトップ8だけ99%の底を呼び出すことに反対して表示したいと思います。 は(DirectOrders 、IN SKU(COUNT(SKU)ASC BY SKU ORDER BY DirectOrders グループからSKU TOP 99パーセントを選択)FROM SELECT受注コード )DirectOrders 受注<> ALL * FROM を選択します。 –

0

アクセスのTOP機能はネクタイを破らないので、トップ8だけを報告するのではなく、あなたの注文ごとにアイテムを注文し、あなたが入れたトップバリューとすべてのネクタイをカバーするのに十分なレポートを出します。たとえば、サンプルデータでは、上位8か上位2の場合は同じ17レコードが表示されますが、SKUのうち1つだけが1つのオーダーしか持たないためです。

トップ8のみを報告する場合は、クエリに追加して順序を一意にする必要があります。この場合、COUNT(SKU) DESC, COUNT(QTY) DESC, MAX(ORDERID) desc, SKUで注文します。注文数が最も多く、数量が多いので、そのSKUを最新のOrderIDに基づいて選択し、それ以外はすべてSKUで注文します。 SKUのみが各行でユニークであることが保証されていますが、実際に関連する「トップ8」を探している場合は、SKUで注文すると最良の結果が得られない場合があります。

SELECT OrderID 
From DirectOrders 
WHERE OrderID NOT IN 
(
    SELECT OrderID 
    FROM DirectOrders 
    WHERE SKU NOT IN 
    (
     SELECT TOP 8 SKU 
     FROM DirectOrders 
     GROUP BY SKU 
     ORDER BY COUNT(SKU) DESC, SUM(QTY) DESC, MAX(ORDERID) DESC, SKU 
    ) 
) 
+0

TOP 8 SKUのみを持つ注文IDのみを表示するにはどうすればよいですか? TOP 8とTOP 8の間に別のSKUがあるかもしれません。 –

+0

申し訳ありませんが、私は '<> ANY'ではなく' NOT IN'を使ってテストしましたが、それらは同等ではありません。私の答えを更新しました。 – Kateract

関連する問題