0

我对 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

但是,数字是错误的(数量太高了),当我之前的查询给我 1900 时,我得到了大约 1600 行。我假设我的 JOIN 语句有问题,但我不知道它是什么。谁能给我一个有效的查询,或者为我的问题指出一个很好的参考?

任何指向良好的通用 SQL 帮助存储库的方向都会很棒......我还没有真正找到任何一个既全面又易于理解的地方。

PS - 我在该查询中调用 SUM() 两次会减慢我的代码速度吗?我不知道 SQL 是如何工作的……从 QUANTITY 列中获取结果并将它们相乘是否足够聪明?如果没有,更有效地运行它的语法是什么?

4

1 回答 1

2

正如我在评论中所说,您的 table 上有多个COSTfor each值。为了让您加入工作,您需要选择一项费用: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 回答