Warm tip: This article is reproduced from serverfault.com, please click

sql-访问Vb6查询

(sql - Access Vb6 query)

发布于 2020-12-17 22:37:33

我需要你的帮助,以使用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

我希望通过图片更好地解释

b1

b2

@Parfait查询的结果

Triyng @Parfait建议,获得的结果与我之前编写的查询非常相似。

在此先感谢你的帮助

Questioner
Jayelef
Viewed
0
Parfait 2020-12-23 06:05:16

考虑通过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);

创建表输出

最终完全联接查询返回以下结果:

全联接查询输出