我在编写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
我已从结果中删除DeptID
,Method
和Life
,以便它们适合此处。
答案 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
就是一个例子,Sum
和min
就是其中的一个例子。因此,select中的每一列必须位于聚合函数或group by子句中才能生效。
答案 1 :(得分:-1)
替换此部分
sum(pc.COST * pc.QUANTITY) AS Total_Cost
通过
(sum(pc.COST) * sum(pc.QUANTITY)) AS Total_Cost
通常这项工作更好