2012-07-25 94 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