可能重复:
Combine rows in Access 2007
Access 2007 - Concatenate fields from one column in one table into a single, comma delmited value in another table
目前我的表结构有点像这样:
名称 --- 猫 --- 描述 --- 打算 --- Perc --- Err --- BP
Bob ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 0 ----- ADC2
鲍勃------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 2 ----- BAC2
Bob ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 0 ----- RBE2
Bob ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 8 ----- VBE2
Bob ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 6 ----- AEC2
鲍勃------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 0 ----- PBC2
鲍勃------- C2 ------- Com ------ 8Per -------- 0.45 ------ 1 ----- XBC4
鲍勃------- C2 ------- Com ------ 8Per -------- 0.45 ------ 0 ----- AEC2
鲍勃------- C2 ------- Com ------ 8Per -------- 0.45 ------ 0 ----- PBC2
鲍勃------- C2 ------- Com ------ 8Per -------- 0.45 ------ 3 ----- ADC2
鲍勃------- C2 ------- Com ------ 8Per -------- 0.45 ------ 0 ----- ADC2
鲍勃------- C2 ------- Com ------ 8Per -------- 0.45 ------ 0 ----- BAC2
乔-------- C1 ------- Inf文件--------- -------- 7Per 0.05 ------ ----- 0 PBC2
乔-------- C1 ------- Inf文件--------- -------- 7Per 0.05 ------ ----- 0 ZTM2
乔-------- C1 ------- Inf文件--------- -------- 7Per 0.05 ------ ----- 2 QYC2
乔-------- C1 ------- Inf文件--------- -------- 7Per 0.05 ------ ----- 0 FLC2
乔-------- C1 ------- Inf文件--------- -------- 7Per 0.05 ------ ----- 1 KSC2
乔-------- C1 ------- Inf文件--------- -------- 7Per 0.05 ------ ----- 0 JYC2
我希望做的是每行#34;姓名"并且对于" Cat",这将总结所有" Err" (按"名称"和" Cat")并且仅连接" BP"字段成一行。如:
名称 --- 猫 --- 描述 --- 打算 --- Perc --- Err --- BP
Bob ------- C1 ------- Inf -------- 7Per -------- 0.05 ----- 16 ----- BAC2,VBE2, AEC2
鲍勃------- C2 ------ Com ------ 8Per -------- 0.45 ------ 4 ------ XBC4,ADC2
乔-------- C1 ------- -------- Inf文件-------- 7Per 0.05 ------ ------ 3 QYC2 ,KSC2
有类似的问题,但我似乎无法应用它,因为我对VBA脚本的了解是初学者。有没有办法通过SQL完成所有这些?如果VBA脚本是唯一的选择(即创建一个函数),我们将非常感谢任何帮助。提前谢谢。
问题第2部分:
我根据Allen Browne的指南创建了这个功能。该模块保存为modConcatRelated。现在,我已经尝试运行此查询(我不确定这是否是正确的SQL以获得我正在寻找的结果):
SELECT
[Name],
[Cat],
[Desc],
[Thresh],
[Perc],
sum([Err]),
ConcatRelated("[BP]", "make_table_bp", "[Err] = " & [BP])
FROM make_table_bp
GROUP BY
[Name],
[Cat],
[Desc],
[Thresh],
[Perc],
[Err],
[BP];
它说"错误3061.参数太少。预计1。"它还说" Undefined Function ConcatRelated。"我正在寻找有关如何创建正确的SQL语句的指导,以便我可以正确调用ConcatRelated函数并产生如上所述的结果。再次感谢。
下一个问题:
如果表中标记了唯一的日期字段作为表中的最后一列,该怎么办?像这样:
名称 --- 猫 --- 描述 --- 打算 --- Perc --- Err --- BP --- 日期
鲍勃------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 0 ----- ADC2--12 / 02/2011让我们说我想构建一个查询,例如:向我显示所有相同格式的记录:
名称 --- 猫 --- 描述 --- 打算 --- Perc --- Err --- BP
Bob ------- C1 ------- Inf -------- 7Per -------- 0.05 ----- 16 ----- BAC2,VBE2, AEC2
鲍勃------- C2 ------ Com ------ 8Per -------- 0.45 ------ 4 ------ XBC4,ADC2
乔-------- C1 ------- -------- Inf文件-------- 7Per 0.05 ------ ------ 3 QYC2 ,KSC2
但的日期范围为01/01/2009至09/31/2011
@HansUp你可以帮忙吗?
答案 0 :(得分:5)
我使用GROUP BY的子查询来计算每个组的Err之和。然后我添加了ConcatRelated函数(from Allen Browne)和子查询返回的字段。这是查询中的查询和输出(基于make_table_bp中的示例数据):
SELECT
sub.[Name],
sub.Cat,
sub.[Desc],
sub.Thresh,
sub.Perc,
sub.SumOfErr,
ConcatRelated("BP",
"make_table_bp",
"[Err] > 0 AND [Name] = '" & sub.[Name]
& "' AND Cat = '"
& sub.Cat & "'",
"BP")
AS concat_BP
FROM
(SELECT
q.[Name],
q.Cat,
q.[Desc],
q.Thresh,
q.Perc,
Sum(q.[Err]) AS SumOfErr
FROM make_table_bp AS q
GROUP BY
q.[Name],
q.Cat,
q.[Desc],
q.Thresh,
q.Perc
) AS sub
ORDER BY
sub.Name,
sub.Cat;
查询输出此结果集:
Name Cat Desc Thresh Perc SumOfErr concat_BP
Bob C1 Inf 7Per 0.05 16 AEC2, BAC2, VBE2
Bob C2 Com 8Per 0.45 4 ADC2, XBC4
Joe C1 Inf 7Per 0.05 3 KSC2, QYC2
注意我在查询中引用它们的每个位置都用方括号括起了Name,Desc和Err。所有都是保留字(见Problem names and reserved words in Access)。如果可能,为这些字段选择不同的名称。如果没有,请使用方括号以避免混淆数据库引擎。
但除非/直到您的数据库引擎识别出您的ConcatRelated函数副本,否则这将不起作用。我不明白为什么不是;我按照您列出的用于存储功能代码的相同步骤,这在我的系统上正常工作。
编辑:我使用我的版本的表测试了该查询,该表具有[Err]作为数字数据类型。听起来像你的文字而不是文字。在这种情况下,我建议你也将你的数字改为数字。我没有看到将数值存储为文本而不是实际数字的好处。
但是如果你坚持使用[Err]作为文本,你可以调整查询来处理它。改变这个......
"[Err] > 0 AND [Name] = '" & sub.[Name]
到此......
"Val([Err]) > 0 AND [Name] = '" & sub.[Name]
当我使用[Err]作为文本数据类型进行测试时,该更改阻止了“条件表达式中的数据类型不匹配”错误。但是,我也改变了这个......
Sum(q.[Err]) AS SumOfErr
到此......
Sum(Val(q.[Err])) AS SumOfErr
AFAICT第二次更改并非绝对必要。当您要求数字Sum()时,数据库引擎似乎愿意接受数字作为文本。但是我更喜欢显式地将它们转换为数值而不是依赖于db引擎来代表我做出正确的猜测。 db引擎有足够的其他东西来处理,所以我试着告诉它我到底想要什么。
Edit2 :如果只想连接唯一值,可以修改ConcatRelated()函数。找到代码的这一部分......
'Build SQL string, and get the records.
strSql = "SELECT " & strField & " FROM " & strTable
并将其更改为此...
'Build SQL string, and get the records.
strSql = "SELECT DISTINCT " & strField & " FROM " & strTable