JT2*_*013 8 ms-access concatenation rows
可能重复:
在Access 2007 Access 2007中组合行
- 将一个表中一列的字段连接到另一个表中的单个逗号分隔值
目前我的表结构有点像这样:
姓名 --- Cat --- Desc --- Thresh --- Perc --- Err --- BP
Bob ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 0 ----- ADC2
Bob ------- 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
Bob ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 0 ----- PBC2
Bob ------- C2 ------- Com ------ 8Per -------- 0.45 ---- --1 ----- XBC4
Bob ------- C2 ------- Com ------ 8Per -------- 0.45 ------ 0- ---- AEC2
Bob ------- C2 ------- Com ------ 8Per -------- 0.45 ------ 0 ----- PBC2
Bob ------- C2 ------- Com ------ 8Per -------- 0.45 ------ 3 ----- ADC2
Bob - ----- C2 ------- Com ------ 8Per -------- 0.45 ------ 0 ----- ADC2
Bob ------ -C2 ------- Com ------ 8Per -------- 0.45 ------ 0 ----- BAC2
Joe -------- C1- ------ Inf --------- 7Per -------- 0.05 ------ 0 ----- PBC2
Joe -------- C1- ------ Inf --------- 7Per -------- 0.05 ------ 0 ----- ZTM2
Joe -------- C1- ------ Inf文件--------- -------- 7Per 0.05 ------ 2-- --- QYC2
乔-------- C1 ------- Inf --------- 7Per -------- 0.05 ------ 0-- --- FLC2
Joe -------- C1 ------- Inf --------- 7Per -------- 0.05 ------ 1-- --- KSC2
乔-------- C1 ------- Inf --------- 7Per -------- 0.05 ------ 0-- --- JYC2
什么我希望做的是有每个"名称"和每个"猫" 1号线,将总结所有的"错误"(每个"名称"和"猫")并连接只有"BP"田成单线.如:
姓名 --- Cat --- Desc --- Thresh --- Perc --- Err --- BP
Bob ------- C1 ------- Inf -------- 7Per -------- 0.05 ----- 16 ----- BAC2,VBE2,AEC2
Bob ------- 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];
Run Code Online (Sandbox Code Playgroud)
它说"错误3061.参数太少.预计1." 它还说"Undefined Function ConcatRelated".我正在寻找有关如何创建正确的SQL语句的指导,以便我可以正确调用ConcatRelated函数并产生如上所述的结果.再次感谢.
下一个问题:
如果表中标记了唯一的日期字段作为表中的最后一列,该怎么办?像这样的东西:
名字 --- 猫 --- 描述 --- Thresh --- Perc --- Err --- BP --- 日期
鲍勃------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 0 ----- ADC2-- 12/02/2011
鲍勃------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 2 --- --BAC2--09/05/2011
Bob ------- C1 ------- Inf -------- 7Per -------- 0.05 ----- -0 ----- RBE2--11/02/2011
Bob ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 8 ----- VBE2--08/14/2012
Bob ------- C1 ------- Inf -------- 7Per ---- ---- 0.05 ------ 6 ----- AEC2--02/25/2009
Bob ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 0 ----- PBC2--07/02/2011
Bob ------- C2 ------- Com --- --- 8Per -------- 0.45 ------ 1 ----- XBC4--09/05/2011
Bob ------- C2 ------- Com ------ 8Per -------- 0.45 ------ 0 ----- AEC2--02/02/2010
Bob ------- C2 ----- --Com ------ 8Per -------- 0.45 ------ 0 ----- PBC2--08/
14/2012 Bob ------- C2-- ----- Com ------ 8Per -------- 0.45 ------ 3 ----- ADC2--05/05/2001
Bob ------- C2 ------- Com ------ 8Per -------- 0.45 ------ 0 ----- ADC2--08/02/2010
Bob ---- --- C2 ------- Com ------ 8Per -------- 0.45 ------ 0 ----- BAC2--06/
17/2010 Joe- ------- ------- C1 --------- Inf文件-------- 7Per 0.05 ------ ----- 0 PBC2-- 08/14/2012
Joe -------- C1 ------- Inf --------- 7Per -------- 0.05 ------ 0 ----- ZTM2--09/05/2011
Joe -------- C1- ------ Inf --------- 7Per -------- 0.05 ------ 2 ----- QYC2--05/17/2010
Joe --- ----- ------- C1 --------- Inf文件-------- 7Per 0.05 ------ ----- 0 FLC2--3/19/2010
Joe -------- C1 ------- Inf --------- 7Per -------- 0.05 ------ 1 --- --KSC2--09/05/2011
Joe -------- C1 ------- Inf --------- 7Per -------- 0.05 --- --- 0 ----- JYC2--08 /二千零十二分之一十四
假设我想建立一个查询来表达类似的内容:向我显示仍然在同一格式内的所有记录:
姓名 --- Cat --- Desc --- Thresh --- Perc --- Err --- BP
Bob ------- C1 ------- Inf -------- 7Per -------- 0.05 ----- 16 ----- BAC2,VBE2,AEC2
Bob ------- C2 ------ Com ------ 8Per- ------- 0.45 ------ 4 ------ XBC4,ADC2
乔-------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 3 ------ QYC2,KSC2
但是对于01/01/2009到09/31/2011的日期范围
@HansUp你可以帮忙吗?
我在GROUP BY中使用子查询来计算每个组的Err之和.然后我添加了ConcatRelated函数(来自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;
Run Code Online (Sandbox Code Playgroud)
查询输出此结果集:
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
Run Code Online (Sandbox Code Playgroud)
请注意,我在查询中引用它们的每个位置都用方括号括起了Name,Desc和Err.所有都是保留字(请参阅Access中的问题名称和保留字).如果可能,为这些字段选择不同的名称.如果没有,请使用方括号以避免混淆db引擎.
但是除非/直到您的数据库引擎识别出ConcatRelated函数的副本,否则这将不起作用.我不明白为什么不是; 我按照您列出的相同步骤存储功能代码,这在我的系统上运行正常.
编辑:我用我的版本的表测试了该查询,该表具有[Err]作为数字数据类型.听起来像你的文字而不是文字.在这种情况下,我建议你也将你的数字改为数字.我没有看到将数值存储为文本而不是实际数字的好处.
但是,如果您坚持使用[Err]作为文本,则可以调整查询以处理它.改变这个......
"[Err] > 0 AND [Name] = '" & sub.[Name]
Run Code Online (Sandbox Code Playgroud)
对...
"Val([Err]) > 0 AND [Name] = '" & sub.[Name]
Run Code Online (Sandbox Code Playgroud)
当我使用[Err]作为文本数据类型进行测试时,该更改阻止了"条件表达式中的数据类型不匹配"错误.但是,我也改变了这个......
Sum(q.[Err]) AS SumOfErr
Run Code Online (Sandbox Code Playgroud)
对...
Sum(Val(q.[Err])) AS SumOfErr
Run Code Online (Sandbox Code Playgroud)
AFAICT第二次变更并非绝对必要.当您要求数字Sum()时,数据库引擎似乎愿意接受数字作为文本.但是我更喜欢显式地将它们转换为数值而不是依赖于db引擎来代表我做出正确的猜测.db引擎有足够的其他东西来处理,所以我试着告诉它我到底想要什么.
Edit2:如果只想连接唯一值,可以修改ConcatRelated()函数.找到代码的这一部分......
'Build SQL string, and get the records.
strSql = "SELECT " & strField & " FROM " & strTable
Run Code Online (Sandbox Code Playgroud)
并将其改为此...
'Build SQL string, and get the records.
strSql = "SELECT DISTINCT " & strField & " FROM " & strTable
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
66888 次 |
| 最近记录: |