抑制MS Access中的行(与在MS Access中将多行连接成单行相关)

时间:2012-02-17 16:40:17

标签: sql ms-access rows

我目前有一个如下所示的表格:

名称 --- --- 描述 --- 打算 --- 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

我使用了创建的功能 http://allenbrowne.com/func-concat.html Allen Browne与以下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]; 

但是现在我想将日期范围合并到SQL中,并且仍然具有基于此日期范围的不同记录。这甚至可能吗?

说查询如下:

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;  

1 个答案:

答案 0 :(得分:1)

包含WHERE子句以限制[Date]值的范围。您还需要对ConcatRelated函数的第三个参数执行相同的操作。 (第三个参数与查询中的WHERE子句的用途相同。)

在主要查询中:

FROM make_table_bp
WHERE [Date] >= #01/01/2009# AND [Date] <= #09/30/2011#
GROUP BY

对于功能:

ConcatRelated("[BP]", "make_table_bp", "[Err] = " & [BP]
   & " AND [Date] >= #01/01/2009# AND [Date] <= #09/30/2011#")

这个建议基于两个假设。

  1. 除了按[日期]范围限制结果外,您问题中的示例查询会执行您想要的操作。
  2. [日期]字段是日期/时间数据类型。
  3. 修改:刚刚在更新的问题中看到了最新的查询版本。我怀疑那是来了。所以试试这个:

    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
            & "' AND [Date] >= #01/01/2009# AND [Date] <= #09/30/2011#",
            "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
        WHERE [Date] >= #01/01/2009# AND [Date] <= #09/30/2011#
        GROUP BY
            q.[Name],
            q.Cat,
            q.[Desc],
            q.Thresh,
            q.Perc
        ) AS sub
    ORDER BY
        sub.Name,
        sub.Cat;