2010-08-27 75 views
1

我有以下SQL查詢:如何在SQL查詢中添加第三個表格包含一個SUM

SELECT porel.refcode, podetail.ponum, SUM(podetail.orderqty * podetail.unitcost) AS Total 
FROM podetail 
LEFT JOIN porel ON podetail.ponum = porel.ponum 
WHERE porel.poline=podetail.poline AND porel.reftype = 'SPEX' 
GROUP BY porel.refcode, podetail.ponum 
ORDER BY porel.refcode, podetail.ponum 

的正常工作帶給我他們對refcodes總值的ponums列表和。我現在要添加第三列vendor.namevendor表的字段vendoridpodetail表共享。

有多個podetail記錄與ponum相同,但這些也將匹配vendorid的。

有人可能會建議如何在vendor.name字段中添加而不返回額外的行嗎?

+0

您可以在屏幕截圖或文本模式的表單中添加表格的結構,行數的示例數據,期望的輸出等嗎? – shahkalpesh 2010-08-27 18:42:19

+0

@shahkalpesh - 我現在不在工作,所以現在不能這樣做,但會在星期一發布第一件事。 – 2010-08-27 19:51:29

回答

2

Heya,Rogue。我想說的比評論更適合,所以在這裏。

一個更容易診斷我的頭的頂部是這樣的:

SELECT 
    porel.refcode, 
    podetail.ponum, 
    SUM(podetail.orderqty * podetail.unitcost) AS Total, 
    podetail.vendorid 
FROM 
    podetail 
    LEFT JOIN porel 
    ON podetail.ponum = porel.ponum 
WHERE 
    porel.poline = podetail.poline 
    AND porel.reftype = 'SPEX' 
GROUP BY 
    porel.refcode, 
    podetail.ponum, 
    podetail.vendorid 
ORDER BY 
    refcode, 
    ponum 

在這裏,我們不加入到vendor可言,以表完全的方程。相反,我們只會捲起podetail.vendorid

你可以發佈此查詢的輸出嗎?

+0

請現在開槍射擊我!我按照你的建議運行了查詢,並且當我注意到* *有*具有相同vendorid的多個供應商時,通過運行'SELECT * from vendor WHERE vendorid = * etc *'來檢查結果!供應商表具有多個部門(公司)的條目,不同部門可以具有相同的「售價」,但針對不同的供應商。什麼是男生錯誤:-s我現在已經在'WHERE'子句中添加了'AND podetail.company = vendor.company',它正在工作。感謝您的幫助和遺憾,浪費了您的時間 – 2010-09-01 09:10:19

+0

@盜賊 - 真棒。還有一件事:你問了幾次關於嵌套的'SELECT ... WHERE EXISTS ... SELECT'。當人們得到的行數超過了你對JOIN的期望時,他們不確定它爲什麼會這樣,但他們試圖像「DISTINCT」,「TOP」,「 MAX','WHERE IN ...'等等。有時候沒問題,但它常常意味着下面有什麼問題,而且你掩蓋了它。當你再次遇到這種情況時,請記住這一點。無論如何,足夠的說教 - 祝你好運與其餘的查詢。 :) – Matt 2010-09-01 17:15:34

+0

非常感謝,我一定會銘記未來。我來自更多的編程背景,而不是數據庫設計背景,儘管我很快拿起了SQL語法,但我依然在數據庫設計的一些錯綜複雜上陷入困境;所以你的幫助和理智檢查是非常寶貴的。 – 2010-09-02 20:37:07

2

將其添加到GROUP BY。我假設每個podetail.ponum都會有一個供應商。順便說一下,由於Where子句中的porel.reftype = 'SPEX',當前的查詢將左連接轉換爲內連接。

SELECT porel.refcode, 
     podetail.ponum, 
     SUM(podetail.orderqty * podetail.unitcost) AS Total, 
     vendor.name 
FROM  podetail 
     INNER JOIN vendor ON podetail.vendorid = vendor.vendorid 
     LEFT JOIN porel ON podetail.ponum = porel.ponum 
WHERE porel.poline=podetail.poline 
AND  porel.reftype = 'SPEX' 
GROUP BY porel.refcode, 
     podetail.ponum, 
     vendor.name 
ORDER BY porel.refcode, 
     podetail.ponum 
+0

感謝您的回答,Martin,我是SQL新手,這對我很有幫助。你的解決方案几乎可以工作,但它返回多個相同的論點,所有這些都具有相同的Total但是具有不同的供應商名稱。 我想我的最初的問題可能不夠具體,以澄清;有多個具有相同貨單的podetail記錄(這些是採購訂單上的行),但我需要整個採購訂單的總計,因此我需要爲每個記錄記錄計算orderqty * unitcost,然後將這些總計加在一起用於記錄相同的文件。 我希望這是有道理的。 – 2010-08-27 12:46:38

+0

@盜賊 - 但是如果有多個供應商名稱,您想在查詢中返回哪一個? – 2010-08-27 13:29:39

+0

只有一個供應商名稱與每個podetail記錄關聯(通過vendorid字段)。如果有多個具有相同後綴的podetail記錄,則它們都具有相同的vendorid。 – 2010-08-27 13:33:37

0
SELECT porel.refcode, 
     podetail.poline, 
     podetail.ponum, 
     SUM(podetail.orderqty * podetail.unitcost) AS Total, 
     vendor.name 
FROM  podetail 
     INNER JOIN vendor ON podetail.vendorid = vendor.vendorid 
     LEFT JOIN porel ON podetail.ponum = porel.ponum 
WHERE porel.poline=podetail.poline 
AND  porel.reftype = 'SPEX' 
GROUP BY porel.refcode, 
     podetail.ponum, 
     vendor.name 
ORDER BY porel.refcode, 
     podetail.poline, 
     podetail.ponum 

我想,你缺少的需要包括podetail.polineSELECTGROUP BY

+0

感謝您的回覆。如您所建議的那樣添加'podetail.poline'會爲每個重複的'ponum'多次顯示相同的'poline'。 我看的越多,看起來像'vendor'表的連接錯誤,因此返回重複行。 – 2010-08-27 13:59:59

+0

我見過另一個查詢,它使用'WHERE EXISTS'嵌套'SELECT',但不熟悉這種查詢的構造。這可能是一個解決方案嗎? – 2010-08-27 14:06:02

0

既然你聚集podetails,只需骨料供應商名稱:

SELECT porel.refcode, podetail.ponum 
, MAX(vendor.name) as VendorName 
, SUM(podetail.orderqty * podetail.unitcost) AS Total 
FROM podetail 
LEFT JOIN vendor on podetail.vendorid = vendor.vendorid 
LEFT JOIN porel ON podetail.ponum = porel.ponum 
WHERE porel.poline=podetail.poline AND porel.reftype = 'SPEX' 
GROUP BY porel.refcode, podetail.ponum 
ORDER BY porel.refcode, podetail.ponum 

或使用MIN(),如果你喜歡。

+0

感謝您的建議。彙總供應商名稱似乎也不起作用。運行你的查詢版本會爲每個'ponum'返回一行(這是我想要的),但供應商名稱和值不正確。 我可能是錯的,但是整合供應商似乎是從錯誤的方向進行的;特別是在沒有聚合的情況下,查詢返回多個不同的供應商爲同一個po,這是不正確的。我會想象,試圖聚合多個不同的供應商總是有機會返回錯誤的供應商。 – 2010-08-31 08:12:30

+0

當然,必須有一種方法來連接'vendor'表格,以便它只返回正確的供應商。也許通過嵌套的'SELECT'語句? – 2010-08-31 08:13:28

+0

您顯然尚未完全描述從podetail到供應商的外鍵引用。一旦我們知道什麼是唯一標識一個podetail,porel和供應商,我們會給你答案,返回你想要的結果。 – bbadour 2010-08-31 11:42:21

相關問題