簡體   English   中英

SQL 幾個內連接導致錯誤的 SUM Result

[英]SQL several inner joins cause wrong SUM Result

我的數據庫示例:(底部的 SQLFiddle 鏈接)

我有幾個表:

登錄

  1. 用戶 ID(整數)
  2. 電子郵件 (varchar)
  3. 密碼
  4. 賽季ID

餐桌商務

  1. ID_Login_ID_Business (int)

  2. 公司名稱 (varchar)

  3. 姓名聯系人(varchhar)

  4. ID_Location_FK (int)

  5. ID_BalancesheetInput_FK (int)

  6. ID_資產負債表輸出(整數)

ID_資產負債輸入

  1. 身份證

  2. FK_Business_ID (int)

  3. 資源名稱 (varchar50)

  4. 金額(十進制)

  5. Unit_Fk (int)

  6. TypeOfRessource_FK(int)

單位

  1. 單位編號

  2. 單位

類型資源

  1. ID_類型

  2. 類型

Sql 應該檢查來自 Buisness 的所有條目,其中 ID_Login_ID_Business(fk) 等於 BalancesheetInput 中的 FK_Business_ID,用相同的 RessourceNam,e 對所有金額求和,並且應該簡單地添加 typeofRessource 檢查正確的單位。

示例:

餐桌商務

ID, NameOfCompany, ID_BalancesheetInput_FK

  • 1 蘋果 1
  • 2 迷你軟件 2

資產負債表輸入

ID、FK_Business_ID、資源名稱、金額、Unit_FK、TypeOFRessource_FK

  • 1, 1, 電, 100, 3, 2
  • 2, 1, 熱能, 200, 3, 2
  • 3, 1, 熱能, 150, 3, 2
  • 4、1、輕質燃料油、10、3、2
  • 5, 1, 螺絲, 200, 3, 2
  • 6, 1, 水, 200,4, 3

單位

單位 ID,單位

  • 1、件
  • 2、噸
  • 3、千瓦時
  • 4、平方米
  • 5、升

類型OF資源

ID_Type, 類型

  • 1、資產
  • 2、能量
  • 3、材質

以下語句嘗試捕獲所選業務的資源並計算具有相同名稱的條目,例如電力。 他們屬於一個公司,但出了點問題。

每次我使用我的 sql 語句時:

"SELECT DISTINCT "
           . "BalancesheetInput.RessourceName AS Rn, "
           . "Units.Unit AS En, "
           . "SUM(BalancesheetInput.Amount) AS TotalAmount "
           . "FROM Business"
           . "INNER JOIN BalancesheetInput ON FK_Business_ID = 1 "
           . "INNER JOIN Units ON Unit_FK = Unit_ID "
           . "INNER JOIN TypeOfRessource ON TypeOf Ressources = 2 "
           . "GROUP BY BalancesheetInput.RessourceName ");

結果

輕質燃料油 60 kWh 能源 - 電力 600 kWh 能源 - 熱能 2100 kWh

看起來他添加了每行的 6 倍。

我想要的結果是:

輕質燃料油 10 kWh 能源 - 電力 100 kWh 能源 - 熱能 350 kWh

這是一個 SQLFiddle ,其中包含所有這些的工作版本。

如果您需要更多信息,只需說出您需要什么來幫助我解決問題。

Luk Storms 和我得出了同樣的答案; 這是我制作SQLFiddle

提示:如果您在 JOIN 上選擇 *,您會看到它為每個 BalancesheetInput 創建了一個包含六行的表; 公司名稱和能源類型的每個組合對應一個。 我們使用 WHERE 來縮小重復行的范圍。 這通常比 SELECT DISTINCT 更好。

此外,“螺絲”被錯誤地歸類為“能量”而不是“材料”。

它有助於為表使用別名。 還要在字段上創建適當的連接,而不是連接應該在 where 子句中的值。

最好確保 GROUP BY 包含您在選擇中使用的所有字段(忽略函數中使用的字段)。
尤其是在使用 MySql 時。

SELECT  
bs.RessourceName AS Rn, 
u.Unit AS En, 
SUM(bs.Amount) AS TotalAmount 
FROM Business b
INNER JOIN BalancesheetInput bs ON bs.FK_Business_ID = b.ID
INNER JOIN Units u ON u.Unit_ID = bs.Unit_FK
INNER JOIN TypeOfRessource t ON t.ID_Type = bs.TypeOFRessource_FK
WHERE b.NameOfCompany = 'Apples' 
AND bs.RessourceName = 'electricity'
GROUP BY bs.RessourceName, u.Unit

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM