总结错误的结果

时间:2014-07-14 17:02:19

标签: sql oracle11g

我在编写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

我已从结果中删除DeptIDMethodLife,以便它们适合此处。

2 个答案:

答案 0 :(得分: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也不包括ASSET_COLOR。因此,红色和蓝色的行组合在一起,sum的{​​{1}}部分将sum(pc.COST * pc.QUANTITY)加在一起。应用于上表的查询的选择和分组将导致:

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     

总结结果

现在您已获得total_Cost列的正确信息,如果您确实想要总结所有这些信息,该怎么办?好吧,由于上述原因,我们不能只在该列的前面添加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 ,但我们需要使用sum()函数和子查询。

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

<强>查询

sum()

如果使用了“示例结果”部分中的数据,则此查询将返回与上面完全相同的结果。这是因为查询中没有重复的行。每个行的所有值必须相同,以便对聚合函数中的任何行进行求和 EXCEPT 。什么是聚合函数? 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 就是一个例子,Summin就是其中的一个例子。因此,select中的每一列必须位于聚合函数或group by子句中才能生效。

答案 1 :(得分:-1)

替换此部分

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

通过

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

通常这项工作更好