0

私は SQL の初心者であり、手続き型言語のバックグラウンドはすべて持っています。私はかなりの困難を抱えていますが、今まで私のすべての質問に対する答えを調査することができました.

次のように構造化された2つのテーブルがあります。

dbo.SERVICE - これまでのすべてのサービス注文/メンテナンス コールのリスト

SERVICE_ORDER_NO | PART_NO | QUANTITY | PART_DESC | CREATED_DT | CHANGED_DT

dbo.PART - サービス対象のマシンのすべてのパーツのリスト

PART_NO | COST

特定の時間枠で使用された部品の合計数量と合計コストを含むリストを取得し、数量で並べ替えたいと考えています。これまでのところ、次のクエリを使用して、使用された部品と数量を適切に取得できました (日付は簡単にするためにハードコーディングされています)。

SELECT SERV.PART_NO, SUM(SERV.QUANTITY) AS QUANTITY
FROM dbo.SERVICE SERV
WHERE SERV.CREATED_DT >= '01/01/2012'  AND SERV.CREATED_DT < '02/01/2012'
GROUP BY SERV.PART_NO
ORDER BY QUANTITY DESC

総費用がなかなか出なくて困っています。私はこれを試しました:

SELECT SERV.PART_NO, SUM(SERV.QUANTITY) AS QUANTITY, SUM(SERV.QUANTITY * PART.COST) AS COST
FROM dbo.SERVICE SERV
INNER JOIN dbo.PART PART
ON PART.PART_NO = SERV.PART_NO
WHERE SERV.CREATED_DT >= '01/01/2012'  AND SERV.CREATED_DT < '02/01/2012'
GROUP BY SERV.PART_NO
ORDER BY QUANTITY DESC

ただし、数値が間違っており (数量が多すぎます)、前のクエリで 1900 行が返されたときに約 1600 行が取得されます。JOIN ステートメントに問題があると想定していますが、それが何であるかはわかりません。誰かが私に有効なクエリを教えてくれますか、または私の問題の良い参考文献を教えてくれますか?

優れた一般的な SQL ヘルプリポジトリへの方向性も素晴らしいでしょう...包括的で簡単に理解できる場所を 1 つも見つけたことがありません。

PS - そのクエリで SUM() を 2 回呼び出すと、コードが遅くなるという事実はありますか? SQL がどのように機能するのかわかりません... QUANTITY 列から結果を取得してそれらを乗算するのは賢明ですか、それともそうではありませんか? そうでない場合、より効率的に実行するための構文は何ですか?

4

1 に答える 1

2

コメントで述べたように、テーブルにCOSTはそれぞれに複数の値があります。参加するには、次の1つのコストを選択する必要があります。PART_NOPART

SELECT SERV.PART_NO, SUM(SERV.QUANTITY) AS QUANTITY, SUM(SERV.QUANTITY * PART.COST) AS COST
FROM dbo.SERVICE SERV
INNER JOIN (SELECT PART_NO, MIN(COST) AS COST 
            FROM dbo.PART 
            GROUP BY PART_NO) AS PART
ON PART.PART_NO = SERV.PART_NO
WHERE SERV.CREATED_DT >= '01/01/2012'  AND SERV.CREATED_DT < '02/01/2012'
GROUP BY SERV.PART_NO
ORDER BY QUANTITY DESC

各パーツの最小コストを選択しましたが、最大または平均に変更できます。

于 2012-07-25T17:30:03.813 に答える