繁体   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