2014-07-14 50 views
0

我很新的写作SQL和我正在努力与此代码。我有4张桌子,我没有得到正确的结果。我认为这可能与joins有关,但我不确定如何继续。数量*金额没有产生正确的数字,并且Deprec金额和LTD数额在每隔一行重复。错误的结果与总和

SELECT pa.BUSINESS_UNIT, 
pc.DEPTID, 
pa.ASSET_ID, 
pa.DESCR, 
pa.IN_SERVICE_DT, 
pc.COST, 
pc.QUANTITY, 
sum(pc.COST * pc.QUANTITY) AS Total_Cost, 
pb.METHOD, 
pb.LIFE, 
pdr.DEPR, 
pdr.DEPR_LTD 

from PS_ASSET pa 
inner join PS_COST pc on pc.ASSET_ID = pa.ASSET_ID and pc.BUSINESS_UNIT = pa.BUSINESS_UNIT 
inner join PS_BOOK pb on pb.ASSET_ID= pa.ASSET_ID and pb.BUSINESS_UNIT = pa.BUSINESS_UNIT 
inner join PS_DEPR_RPT pdr on pdr.ASSET_ID= pa.ASSET_ID and pdr.BUSINESS_UNIT = pa.BUSINESS_UNIT 

where pa.BUSINESS_UNIT = 'A0057' 
and pa.ASSET_ID = '000000000020' 
and pb.BOOK = 'PERFORM' 
and pdr.FISCAL_YEAR = '2014' 
and pdr.ACCOUNTING_PERIOD = '12' 

group by 
pa.BUSINESS_UNIT, 
pc.DEPTID, 
pa.ASSET_ID, 
pa.DESCR, 
pa.IN_SERVICE_DT, 
pc.COST, 
pc.QUANTITY, 
pb.METHOD, 
pb.LIFE, 
pdr.DEPR, 
pdr.DEPR_LTD 

下面是我得到的结果:

A0057 000000000020 Vehicle Equipment  50 1  650  4.16  8.33 
A0057 000000000020 Vehicle Equipment  50 1  650 43.75 87.5 
A0057 000000000020 Vehicle Equipment 1000 1 13000  4.16  8.33 
A0057 000000000020 Vehicle Equipment 1000 1 13000 43.75 87.5 
A0057 000000000020 Vehicle Equipment  100 2  2600  4.16  8.33 
A0057 000000000020 Vehicle Equipment  100 2  2600 43.75 87.5 

我已经删除DeptIDMethod,并且Life从结果,使他们适应这里。

回答

1

TLDR

摆脱总和得到找到正确的总成本pc.COST * pc.QUANTITY AS Total_Cost,

问题

它看起来像你的查询返回多个结果,然后group by被其分组为一条线。 sum然后将所有结果加在一起给你意想不到的结果。

让我详细说明一下,以便更清楚一点。您的表格最有可能列有比您选择的更多的列。即使只有一个表的列数多于您选择的列数,也可能有多个结果行。我们只关注PS_ASSET。我知道PS_ASSET有列BUSINESS_UNIT,ASSET_ID,DESCR和IN_SERVICE_DT。假设它也有ASSET_COLOR列。

接下来,让我们给PS_ASSET一些假数据。也许表看起来像这样:

BUSINESS_UNIT | ASSET_ID  | DESCR | IN_SERVICE_DT | ASSET_COLOR 
A0057   | 000000000020 | Vehicle | Equipment  | Red 
A0057   | 000000000020 | Vehicle | Equipment  | Blue 

因为颜色的,你的结果表实际上是这样的:

A0057 000000000020 Vehicle Equipment  50 1  50  4.16  8.33 red 
A0057 000000000020 Vehicle Equipment  50 1  50  4.16  8.33 blue 
A0057 000000000020 Vehicle Equipment  50 1  50 43.75 87.5  red 
A0057 000000000020 Vehicle Equipment  50 1  50 43.75 87.5  blue 
A0057 000000000020 Vehicle Equipment 1000 1 1000  4.16  8.33 red 
A0057 000000000020 Vehicle Equipment 1000 1 1000  4.16  8.33 blue 
A0057 000000000020 Vehicle Equipment 1000 1 1000 43.75 87.5  red 
A0057 000000000020 Vehicle Equipment 1000 1 1000 43.75 87.5  blue 
A0057 000000000020 Vehicle Equipment 100 2  200  4.16  8.33 red 
A0057 000000000020 Vehicle Equipment 100 2  200  4.16  8.33 blue 
A0057 000000000020 Vehicle Equipment 100 2  200 43.75 87.5  red 
A0057 000000000020 Vehicle Equipment 100 2  200 43.75 87.5  blue 

示例结果

但是,您的select语句不包含ASSET_COLOR,而您的group by也不包含。因此,红色和蓝色的行被分组在一起,sum(pc.COST * pc.QUANTITY)sum部分将COST*QUANTITY添加在一起。通过您的查询的选择和组应用到上面的表格会导致:

A0057 000000000020 Vehicle Equipment  50 1  100  4.16  8.33  
A0057 000000000020 Vehicle Equipment  50 1  100 43.75 87.5  
A0057 000000000020 Vehicle Equipment 1000 1 2000  4.16  8.33  
A0057 000000000020 Vehicle Equipment 1000 1 2000 43.75 87.5  
A0057 000000000020 Vehicle Equipment 100 2  400  4.16  8.33  
A0057 000000000020 Vehicle Equipment 100 2  400 43.75 87.5  

找到正确的结果

这个故事告诉我们,除去总和,你应该得到什么你期待

SELECT pa.BUSINESS_UNIT, 
pc.DEPTID, 
pa.ASSET_ID, 
pa.DESCR, 
pa.IN_SERVICE_DT, 
pc.COST, 
pc.QUANTITY, 
pc.COST * pc.QUANTITY AS Total_Cost, 
pb.METHOD, 
pb.LIFE, 
pdr.DEPR, 
pdr.DEPR_LTD 

求和结果

所以,现在你有total_Cost列的正确信息,如果你真的想总结所有这些信息呢?那么,由于上述原因,我们不能只在该列的前面添加sum(),但我们需要使用sum()函数和子查询。

将查询更改为子查询本质上允许您使用结果表的列并忽略之前使用的表的表结构。这意味着我们可以总结总值。

查询

SELECT p.BUSINESS_UNIT, 
p.DEPTID, 
p.ASSET_ID, 
p.DESCR, 
p.IN_SERVICE_DT, 
p.COST, 
p.QUANTITY, 
sum(p.Total_Cost) 
p.METHOD, 
p.LIFE, 
p.DEPR, 
p.DEPR_LTD 

From (--Your previous Query Here) 

Group by p.BUSINESS_UNIT, 
     p.DEPTID, 
     p.ASSET_ID, 
     p.DESCR, 
     p.IN_SERVICE_DT, 
     p.COST, 
     p.QUANTITY, 
     p.METHOD, 
     p.LIFE, 
     p.DEPR, 
     p.DEPR_LTD 

如果结果被用来从实施例中的数据部分中的这个查询将返回准确相同的结果如上述。这是因为查询中没有重复的行。对于聚合函数中的任何行,除了每行的所有值必须相同以便出现以外。什么是聚合函数? Sum就是一个例子,minmax就是这样的其他例子。因此,select中的每一列都必须处于聚合函数或group by子句中才能工作。

+0

谢谢你的帮助。这将是一个非常缓慢的学习曲线。我非常感谢你对这个解释的帮助。 – Shaves

+0

@Shaves如果有任何鼓励,我大概在14个月前从未见过sql。你可能会比你想象得更快。 – Jenn

+0

珍恩.........这个伎俩。现在我刚刚摆脱Depr和Depr_LTD系列中的重复内容,我认为我很好走 – Shaves

-1

通过

(sum(pc.COST) * sum(pc.QUANTITY)) AS Total_Cost 

正常更换这部分

sum(pc.COST * pc.QUANTITY) AS Total_Cost 

这项工作更好

+0

谢谢你的帮助。我非常感谢你的帮助 – Shaves