在MS Access中将多行连接成单行

时间:2012-02-09 19:14:24

标签: ms-access concatenation rows

  

可能重复:
  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
鲍勃------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 2 ----- BAC2-- 09/05/2011
鲍勃------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 0 ----- RBE2-- 11/02/2011
鲍勃------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 8 ----- VBE2-- 08/14/2012
鲍勃------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 6 ----- AEC2-- 02/25/2009
鲍勃------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 0 ----- PBC2-- 07/02/2011
鲍勃------- C2 ------- Com ------ 8Per -------- 0.45 ------ 1 ----- XBC4--09 / 05/2011
鲍勃------- C2 ------- Com ------ 8Per -------- 0.45 ------ 0 ----- AEC2--02 / 02/2010
鲍勃------- C2 ------- Com ------ 8Per -------- 0.45 ------ 0 ----- PBC2--08 /二千零十二分之十四
鲍勃------- C2 ------- Com ------ 8Per -------- 0.45 ------ 3 ----- ADC2--05 / 05/2001
鲍勃------- C2 ------- Com ------ 8Per -------- 0.45 ------ 0 ----- ADC2--08 / 02/2010
鲍勃------- C2 ------- Com ------ 8Per -------- 0.45 ------ 0 ----- BAC2--06 /二千零一十分之一十七
乔-------- C1 ------- Inf文件--------- -------- 7Per 0.05 ------ ----- 0 PBC2 --08 /二千零十二分之十四
乔-------- C1 ------- Inf文件--------- -------- 7Per 0.05 ------ ----- 0 ZTM2 --09 / 05/2011
乔-------- C1 ------- Inf文件--------- -------- 7Per 0.05 ------ ----- 2 QYC2 --05 /二千零十分之一十七
乔-------- C1 ------- Inf文件--------- -------- 7Per 0.05 ------ ----- 0 FLC2 --3 /二千零一十分之一十九
乔-------- C1 ------- Inf文件--------- -------- 7Per 0.05 ------ ----- 1 KSC2 --09 / 05/2011
乔-------- C1 ------- Inf文件--------- -------- 7Per 0.05 ------ ----- 0 JYC2 - 08/14/2012

让我们说我想构建一个查询,例如:向我显示所有相同格式的记录:

名称 --- --- 描述 --- 打算 --- 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你可以帮忙吗?

1 个答案:

答案 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