2012-07-25 47 views
0

我對SQL很陌生,我的所有背景都是過程語言。我遇到了很多困難,直到現在才能夠研究我所有問題的答案。SQL連接和乘法

我有兩個表,結構如下所示:

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 

然而,數字是錯誤的(量太高了),我也得到約1600行的時候我以前的查詢給了我1900,我假設有什麼毛病我的JOIN語句,但我不知道它是什麼。任何人都可以給我一個工作查詢,或指出我對我的問題很好的參考?

任何方向到良好的一般SQL幫助存儲庫也將是偉大的......我還沒有真正發現任何一個既全面又易於理解的地方。

PS - 這個事實,我在該查詢中調用SUM()兩次會減慢我的代碼?我不知道SQL是如何工作的......是否足夠聰明地從QUANTITY列中獲取結果並將它們相乘,或者不是?如果不是,那麼更有效地運行它的語法是什麼?

+1

然後你有同樣的部分的多個成本,你需要先選擇一個,它可以是最小值,最大值,平均值.... – Lamak 2012-07-25 17:26:44

+0

這聽起來像你需要修復成本表,所以你有每個成本的時間框架。該表中part_no不唯一。 – 2012-07-25 17:47:51

回答

2

正如我在評論中所說,您的表PART上的每個PART_NO有多個值COST。爲了您的加盟工作,你需要選擇一個成本:

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 

我選擇了每個零件的成本最低,但你可以將其更改爲最大值或平均值。

+1

Max最喜歡的是最新的,但真正的表設計是問題。你應該能夠從表格中看出當前的價格是多少。我會建議添加開始日期和結束日期,並使用新的價格輸入觸發器來填充任何沒有結束日期的部分的結束日期。 – HLGEM 2012-07-25 17:39:17

+0

不幸的是,我無法訪問表結構,只是其中的數據。然而,非常感謝您的幫助。 – alexgerst 2012-07-26 13:34:06