Sql server 连接两个表的结果不正确
以下是给出错误结果的SQL查询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
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和这些交易的合并视图,而不需要将查询加入收入表。我还上传了您提供的查询解决方案的结果。正如您将看到的,收入已除以交易数量,没有任何收入的交易不进行计算。