【问题标题】:suppress rows in MS Access (related to Concatenating multiple rows into single line in MS Access)抑制 MS Access 中的行(与在 MS Access 中将多行连接成单行有关)
【发布时间】:2012-03-09 01:55:54
【问题描述】:

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

名字 --- --- Desc --- Thresh --- Perc --- Err --- BP --- 日期

Bob --------C1--------Inf--------7Per--------0.05--------0----- ADC2--12/02/2011
Bob --------C1--------Inf--------7Per--------0.05--------2-----BAC2-- 09/05/2011
Bob --------C1--------Inf--------7Per--------0.05--------0-----RBE2-- 2011 年 11 月 2 日
Bob --------C1--------Inf--------7Per--------0.05--------8-----VBE2-- 2012 年 8 月 14 日
Bob --------C1--------Inf--------7Per--------0.05--------6-----AEC2-- 2009 年 2 月 25 日
Bob --------C1--------Inf--------7Per--------0.05--------0-----PBC2-- 2011 年 7 月 2 日
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
乔--------C1--------Inf---------7Per--------0.05--------0-----PBC2 --08/14/2012
乔--------C1--------Inf---------7Per--------0.05--------0-----ZTM2 --09/05/2011
乔--------C1--------Inf---------7Per--------0.05--------2-----QYC2 --05/17/2010
乔--------C1--------Inf---------7Per--------0.05--------0-----FLC2 --3/19/2010
乔--------C1--------Inf---------7Per--------0.05--------1-----KSC2 --09/05/2011
乔--------C1--------Inf---------7Per--------0.05--------0-----JYC2 --08/14/2012

假设我想构建一个查询来表达如下内容:显示所有仍采用相同格式的记录:

名字 --- --- 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

我已经使用了由 http://allenbrowne.com/func-concat.htmlAllen 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;  

【问题讨论】:

    标签: sql ms-access rows


    【解决方案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. 除了将结果限制在 [Date] 范围之外,您问题中的示例查询可以满足您的需求。
    2. [Date] 字段是日期/时间数据类型。

    编辑:刚刚在您更新的问题中看到了最新的查询版本。我怀疑那要来了。所以试试这个:

    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;  
    

    【讨论】:

    • 当我执行上述查询时,我得到一个错误:“查询表达式中的日期语法错误 '[Date] >= #01/01/2009# AND [Date]
    • # 字符是日期/时间文字值的分隔符。 make_table_bp 表中 [Date] 字段的数据类型是什么?是日期/时间还是文本?
    • 那我很难过。 Date 是一个保留字,但您将它用方括号括起来,以便 应该 避免混淆数据库引擎。我不明白您为什么会收到语法错误。
    • 我注意到,如果我去掉 WHERE 子句和“ConcatRelated”中对日期的第二个“AND”引用,它似乎工作正常。因此,如果我只是说 [Date] >= #01/01/2009#...没有问题。这对我来说没有意义!
    • 另一个答案,现已删除,指出 #09/31/2011# 不是有效日期。我将这个答案改为使用 #09/30/2011#。
    猜你喜欢
    • 1970-01-01
    • 2019-11-07
    • 1970-01-01
    • 2016-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多