SQL几个内部联接导致错误的SUM结果

时间:2016-05-22 16:52:22

标签: mysql sql

这是我在Stackoverflow上的第一篇文章,因为我不知道如何处理这个问题。

首先,我要原谅我糟糕的英语。

现在,我想给你一个我的数据库的例子。 (底部的SQLFiddle链接)

我有几张表:

登录

  1. User_ID(int)
  2. 电子邮件(varchar)
  3. Passwort
  4. Seassion ID
  5. 商家

    1. ID_Login_ID_Business(int)

    2. NameOfCompany(varchar)

    3. NameContact(varchhar)

    4. ID_Location_FK(int)

    5. ID_BalancesheetInput_FK(int)

    6. ID_Balancesheetoutput(int)的

    7. ID_BalancesheetInput

      1. ID

      2. FK_Business_ID(int)

      3. RessourceName(varchar50)

      4. 金额(十进制)

      5. Unit_Fk(int)

      6. TypeOfRessource_FK(int)的

      7. 表格单位

        1. UNIT_ID

        2. 单元

        3. TypeOfRessource

          1. ID_TYPE

          2. 类型

          3. 现在我尝试解释我想要做什么,以及如何显示结果。

            Sql应检查来自Buisness的所有条目,其中ID_Login_ID_Business(fk)等于BalancesheetInput中的FK_Business_ID,并使用相同的RessourceName对所有金额求和,并且应该简单地添加typeofRessource并检查正确的单位。

            示例:

            商家

            ID,NameOfCompany,ID_BalancesheetInput_FK

            • 1 Apples 1
            • 2 Minisoft 2

            表格 BalancesheetInput

            ID,FK_Business_ID,RessourceName,Amount,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,Water,200,4,3

            表格单位

            单位ID,单位

            • 1,件
            • 2,Ton
            • 3,kWh
            • 4,m²
            • 5,升

            TypeOFRessource

            ID_Type,类型

            • 1,资产
            • 2,Energie
            • 3,材料

            有以下声明我尝试捕获选择业务的资源并计算具有相同名称的条目,例如电力属于一家公司,但出现问题。

            每次我使用我的sql Statment:

            "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千瓦时 能源 - 电力600千瓦时 能源 - 热能2100千瓦时

            看起来他增加了每行数量的6倍。

            我想要的结果是什么:

            轻质燃油10千瓦时 能源 - 电力100千瓦时 能源 - 热能350千瓦时

            Here is an SQLFiddle以及所有这些的工作版本。

            也许有些人可以帮助我摆脱这种苦难。

            如果您需要进一步的信息,请说出您需要帮助我解决问题的方法。

            先谢谢了!

2 个答案:

答案 0 :(得分:1)

Luk Storms和我得到了同样的答案;这是SQLFiddle I made

提示:如果您在JOIN上选择*,则see它为每个BalancesheetInput创建一个包含六行的表格;每个组合的公司名称和能源类型。我们使用WHERE来缩小重复的行。这通常比SELECT DISTINCT更好。

此外,"螺丝"被错误归类为" Energie"而不是" Materiel"。

答案 1 :(得分:0)

有助于为表使用别名。还要在字段上创建正确的连接,而不是连接应该在where子句中的值。

最好确保GROUP BY包含您在select中使用的所有字段(忽略函数中使用的字段)。
特别是在使用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