Sql server 连接两个表的结果不正确

Sql server 连接两个表的结果不正确,sql-server,join,datagridview,Sql Server,Join,Datagridview,以下是给出错误结果的SQL查询 Select ASXCode.Stock_Code, Count(Bought.Number_Bought) as Transactions, SUM(Bought.Number_Bought) as Bought, SUM(Bought.Total_Cost) / SUM(Bought.Number_Bought) AS Average_Price, SUM(Bought.Acc_Interest) as In

以下是给出错误结果的SQL查询

Select  ASXCode.Stock_Code, Count(Bought.Number_Bought) as Transactions, 
        SUM(Bought.Number_Bought) as Bought,
        SUM(Bought.Total_Cost) / SUM(Bought.Number_Bought) AS Average_Price,
        SUM(Bought.Acc_Interest) as Interest,
        SUM(Income.Total_Income) / COUNT(Bought.Number_Bought) as Derived_Income,  
        Sum(Bought.Total_Cost + Bought.Acc_Interest + Income.Neg_Total_Income) / SUM(Bought.Number_Bought) as Breakeven
FROM 
    ASXCode 
  LEFT JOIN 
    Bought ON Bought.Stockid = ASXCode.Stockid
  LEFT JOIN 
    Income ON ASXCode.Stockid = Income.Incomeid
GROUP BY 
    ASXCode.Stock_Code
上述SQL查询在DataGridview中产生如下结果:

 Stock_Code|Transactions|Bought|Average_Price|Interest|Derived_Income| Breakeven   
      ASL         2      10000      0.45       15.00                                                                           
      RCR         2       5000      1.90       55.35   
      SKE         6      20000      1.27      148.97    1071.43        0.96 

此表有两个问题。在计算盈亏平衡价格时,总收入乘以交易数量。正确的盈亏平衡价格约为1.22。如果我可以添加“除以COUNT Number_行的总和”,则查询的这一部分可以修复。但是,我没有成功地将其包含在查询中。第二,由于其他两种股票没有收入,收入字段为空,我认为这使得不可能计算盈亏平衡价格。我认为这个问题可以通过在查询中包含“where income not null”来解决。然而,尽管我做了各种尝试,试图在查询中包含这样一个语句,我还是画了一个空白。我真的很想找到解决我问题的办法。

我想你的问题来自于你有一个主表和两个细节表,如下所示:

[ Bought ] *-------1 [ ASXCode ] 1-------* [ Income ]
SELECT *
FROM ASXCode AS A
    LEFT OUTER JOIN
    (SELECT *
     FROM Bought
     GROUP BY *) AS B ON A.PK = B.FK
    LEFT OUTER JOIN
    (SELECT *
     FROM Income
     GROUP BY *) AS I ON A.PK = I.FK
因此,当您需要一个基于
ASXCode
的结果,并在
bunded
上详细说明时,不需要与
Income
交叉,反之亦然;您需要这样的查询:

[ Bought ] *-------1 [ ASXCode ] 1-------* [ Income ]
SELECT *
FROM ASXCode AS A
    LEFT OUTER JOIN
    (SELECT *
     FROM Bought
     GROUP BY *) AS B ON A.PK = B.FK
    LEFT OUTER JOIN
    (SELECT *
     FROM Income
     GROUP BY *) AS I ON A.PK = I.FK
因此,对于您来说,我认为这个查询应该正确工作:

SELECT
    A.Stock_Code, 
    B.Count_Number_Bought as Transactions, 
    B.SUM_Number_Bought as Bought,
    B.SUM_Total_Cost / B.SUM_Number_Bought AS Average_Price,
    B.SUM_Acc_Interest as Interest,
    I.SUM_Total_Income / B.Count_Number_Bought as Derived_Income,  
    (B.SUM_Total_Cost + B.SUM_Acc_Interest + I.SUM_Neg_Total_Income) / B.SUM_Number_Bought as Breakeven
FROM 
    ASXCode AS A
  LEFT JOIN 
    (SELECT 
         Bought.Stockid,
         COUNT(Bought.Number_Bought) As COUNT_Number_Bought,
         SUM(Bought.Number_Bought) AS SUM_Number_Bought,
         SUM(Bought.Total_Cost) AS SUM_Total_Cost,
         SUM(Bought.Acc_Interest) AS SUM_Acc_Interest
     FROM 
         Bought 
     GROUP BY 
         Bought.Stockid) AS B ON B.Stockid = A.Stockid
  LEFT JOIN
    (SELECT 
         Income.Stockid,
         SUM(Income.Total_Income) AS SUM_Total_Income,
         SUM(Income.Neg_Total_Income) AS SUM_Neg_Total_Income
     FROM
         Income 
     GROUP BY
         Income.Stockid) AS I ON A.Stockid = I.Stockid

看看查询在没有聚合和分组依据的情况下返回的结果。另外,在incomeid上加入stockid实际上是您想要的吗?什么是基数添加一个小样本数据集。如果我知道收入模式,我想我可以提供一个更好的解决方案,但我猜对于给定的stockid有一个行项目,对吗?如果是这种情况,请使用相同的查询创建一个CTE,但不包括对收入的引用。然后,加入CTE获得收入。这将解决第一个问题。我是一个完全的新手,你的表达CTE是我第一次听到它。一个快速的谷歌搜索提供了简短的信息,我将进一步研究这一点。ASXCode表连接到购买表和收入表。我已在以下链接上载了架构:Inchttps://www.flickr.com/photos/133286229@N02谢谢您提供的信息。关于数据库的结构,您是正确的。然而,您关于收入FK的评论强调(我认为)我的数据库构建中存在错误。我现在想知道我的FK是否命名错误?我已将我的数据库模式上载到@Johnkg。我将我的查询编辑为您的模式,希望它能为您提供正确的结果;)。shAt,我忘了提到我无法运行您的查询,并收到一条消息“关键字“ON”附近的语法不正确:”这使我相信我的数据库本身有问题。@Johnkg我想现在应该删除它;)。现在,我已经上传了(同一链接)我的交易详情的datagridview和这些交易的合并视图,而不需要将查询加入收入表。我还上传了您提供的查询解决方案的结果。正如您将看到的,收入已除以交易数量,没有任何收入的交易不进行计算。