2014-07-14 48 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