【问题标题】:Create a comma-separated string from multiple rows of one column?从一列的多行创建一个逗号分隔的字符串?
【发布时间】:2011-12-06 18:10:38
【问题描述】:

我有一个这样的访问表

ID | UserName | CarBrand
-------------------------
0    Peter      VW
1    Peter      Ferrari
2    Mike       Audi
3    Peter      Dodge
4    Heidi      BMW
5    Heidi      Ford

我需要 CarBrand 字段中的名称作为报告的逗号分隔列表。

有没有办法(没有 VB,也许使用 COALESCE 替代方案?)创建一个像这样的逗号分隔字符串,没有 Name: 部分?

Peter: VW, Ferrari, Dodge
Mike:  Audi
Heidi: BMW, Ford

由于它是用于报告,还有其他方法可以做到这一点,也许在报告中使用表达式?

【问题讨论】:

  • 建议的表不是第一范式。考虑使用报告或其他“前端”工具进行显示。还要考虑在 Stackoverflow 上投票最多的 most common SQL antipattern 是在 SQL 中而不是在前端进行格式化。
  • 我认为在报告中也没有简单的方法可以做到这一点,您仍然需要使用 VBA 函数。

标签: sql ms-access ms-access-2003


【解决方案1】:

没有 VBA 的 Access 无法做到这一点。 Coalesce 不存在,但您可以编写一个具有某些功能的 UDF,例如 http://allenbrowne.com/func-concat.html 但是,一旦使用 UDF,查询在 Access 之外就不再可行。

【讨论】:

    【解决方案2】:

    使用唯一的用户名列表创建一个主报告。

    创建包含用户名及其汽车品牌列表的子报告。加入用户名上的表单。在子窗体的设计中,使用水平打印的 4-5 列。您可以让 CarBrand 字段包含一个公式,例如 =[CarBrand] & ", " (抱歉,最后一个将有一个不必要的逗号。它们将均匀分布,如果特定用户有更多,它们将分成一个新行超出您报告范围的品牌(如果您只创建一个以逗号分隔的大字符串,这将很难做到。)。

    根本不涉及 VBA。

    【讨论】:

      【解决方案3】:

      如果您不需要逗号分隔列表中的每个值,而只说前 3 或 4 个左右,那么 Access 中有一个纯 SQL 解决方案。

      我正在为一家拥有导师和课程的非营利组织开发数据库。对于大多数课程,只有 1 或 2 名导师。出于展示的目的,我无论如何不能列出超过 2 或 3 个,所以我不担心会截断 5 个或更多导师的异常值。

      这将获取每个班级的导师 ID 最低的 3 位导师

      Select JTC1.ClassID, Min(JTC1.TID1) as TutorID1,
        Min(JTC1.TID2) as TutorID2,
        Min(JTC1.TID3) as TutorID3 
      from (
        Select distinct TC1.ClassID,
          TC1.TutorID as TID1,
          TC2.TutorID as TID2,
          TC3.TutorID as TID3 
        from ((
         Classes C 
         Left Join TutorClasses TC1 
           on C.ClassID = TC1.ClassID)
         Left Join TutorClasses TC2 
           on TC1.ClassID = TC2.ClassID and TC1.TutorID < TC2.TutorID
         )
         Left Join TutorClasses TC3
           on TC2.ClassID = TC3.ClassID and TC2.TutorID < TC3.TutorID
         ) as JTC1
      Group by JTC1.ClassID
      

      显然,将三列合并为 1 列需要 1 个额外步骤(未显示)。

      【讨论】:

        猜你喜欢
        • 2021-10-06
        • 1970-01-01
        • 2021-09-26
        • 1970-01-01
        • 2022-10-05
        • 1970-01-01
        • 2016-10-26
        • 1970-01-01
        相关资源
        最近更新 更多