我需要你的帮助,以使用vb6和access db构建sql查询。这是场景:2个表,Tive和Have Tb1字段Id,Name,Amount Tb2 Id,Name,Amount我需要在两个表中都包含每个名称的总数,以便具有Total Give列和total have列,但是我的查询不起作用
Select tb1.id,tb1.name,sum(tb1.amount) as TG, tb2.id,tb2.name,sum(tb2.amount) as TH
from tb1 inner join
tb2
on tb1.id=tb2.id
group by... Etc
如果我有10条记录,其中tb1上的id = 1,tb 2上的3条记录,则tb2上的总量是错误的(它对tb1上的每条记录重复tb2上的总和)
我也尝试过使用Union在行中获得正确的结果,但我应该想要获得类似的东西
Id Name Have Give
1 John Doe 200,00 76,00
我希望通过图片更好地解释
Triyng @Parfait建议,获得的结果与我之前编写的查询非常相似。
在此先感谢你的帮助
考虑通过id
以下方式分别联接两个表的聚合:
聚合查询 (另存为存储的Access查询)
SELECT tb1.idF
, tb1.[name]
, SUM(tb1.Give) AS TG
FROM tblGive tb1
GROUP BY tb1.idF
, tb1.[name]
SELECT tb2.IDB
, tb2.[name]
, SUM(tb2.Have) AS TH
FROM tblHave tb2
GROUP BY tb2.IDB
, tb2.name
最终查询 (运行完全连接查询以返回任一表中的所有不同名称)
SELECT NZ(agg1.idF, agg2.idB) AS [id]
, NZ(agg1.name, agg2.name) AS [name]
, NZ(agg2.TH, 0) AS [Have]
, NZ(agg1.TG, 0) AS [Give]
FROM tblGiveAgg agg1
LEFT JOIN tblHaveAgg agg2
ON agg1.idF = agg2.idB
UNION
SELECT NZ(agg1.idF, agg2.idB) AS [id]
, NZ(agg1.name, agg2.name) AS [name]
, NZ(agg2.TH, 0) AS [Have]
, NZ(agg1.TG, 0) AS [Give]
FROM tblGiveAgg agg1
RIGHT JOIN tblHaveAgg agg2
ON agg1.idF = agg2.idB;
用以下数据进行演示
CREATE TABLE tblGive (
ID AUTOINCREMENT,
IdF INTEGER,
[Name] TEXT(10),
Give INTEGER
);
INSERT INTO tblGive (IdF, [Name], [Give]) VALUES (1, 'JOHN', 37);
INSERT INTO tblGive (IdF, [Name], [Give]) VALUES (2, 'ANNA', 10);
INSERT INTO tblGive (IdF, [Name], [Give]) VALUES (3, 'BILL', -37);
INSERT INTO tblGive (IdF, [Name], [Give]) VALUES (2, 'ANNA', 116);
INSERT INTO tblGive (IdF, [Name], [Give]) VALUES (1, 'JOHN', 120);
CREATE TABLE tblHave (
ID AUTOINCREMENT,
IDB INTEGER,
[Name] TEXT(10),
Have INTEGER
);
INSERT INTO tblHave (IDB, [Name], [Have]) VALUES (1, 'JOHN', 200);
INSERT INTO tblHave (IDB, [Name], [Have]) VALUES (2, 'ANNA', 400);
INSERT INTO tblHave (IDB, [Name], [Have]) VALUES (3, 'BILL', 150);
INSERT INTO tblHave (IDB, [Name], [Have]) VALUES (1, 'JOHN', 25);
INSERT INTO tblHave (IDB, [Name], [Have]) VALUES (1, 'JOHN', 70);
最终完全联接查询返回以下结果:
嗨,@ Parfait,也感谢您的回答。您的sql查询给出了一个结果,但它与我的预期不同,因为它仅聚合两个表中的名称。因此,如果我有下面要说明的情况,Tb1 1约翰150 2迈克300 1约翰200 Tb2 16托尼32 1约翰50 20安娜25它只给约翰以他正确的差额给予/拥有,我应该鼓励找到1约翰350 50 2迈克300 0 20安娜0 25谢谢
谢谢@Parfait,但是我在Join过程中收到语法错误。显然,上面表示的两个查询可以完美地工作,而对于最终查询则并非如此。我仍在进行一些测试,以查看错误是否是由于转录错误引起的
感谢您的新答案,我已经看到了健忘,并且已经在测试中更正了该查询,该查询运行完美,不幸的是,我必须告诉您,即使该公式也无法产生我想要的结果。我得到的名称重复的方式与使用普通INNER JOIN的方式相同。
感谢@Parfait,我已经发布了3张说明图片;-)
第三。第一个图像是名为Give的表,第二个图像是Have表。如您所见,在每个表格中,您都可以找到许多独立的运动。因此,比尔必须收钱,但他什么都没有支付,其他人在两个表中都有记录。结果可能是一列中所有运动的sinthesys,每个IDF一行一行