Sql 是否从一列的多行中创建逗号分隔的字符串?

Sql 是否从一列的多行中创建逗号分隔的字符串?,sql,ms-access,ms-access-2003,Sql,Ms Access,Ms Access 2003,我有一个这样的访问表 ID | UserName | CarBrand ------------------------- 0 Peter VW 1 Peter Ferrari 2 Mike Audi 3 Peter Dodge 4 Heidi BMW 5 Heidi Ford 我需要CarBrand字段中的名称作为报告的逗号分隔列表 有没有一种没有VB的方法,可能使用合并替代方案?要创建这样一个

我有一个这样的访问表

ID | UserName | CarBrand
-------------------------
0    Peter      VW
1    Peter      Ferrari
2    Mike       Audi
3    Peter      Dodge
4    Heidi      BMW
5    Heidi      Ford
我需要CarBrand字段中的名称作为报告的逗号分隔列表

有没有一种没有VB的方法,可能使用合并替代方案?要创建这样一个逗号分隔的字符串,而不使用名称:part


对于报告,是否有其他方法可以做到这一点,可能在报告中使用表达式

如果没有VBA,则无法执行此操作。Coalesce不存在,但您可以编写具有某些功能的UDF,例如
但是,一旦使用UDF,查询在Access之外就不再可行。

创建一个具有唯一用户名列表的主报表

创建包含用户名及其汽车品牌列表的子报告。在用户名上加入表单。在子窗体的设计中,使用水平打印的4-5列。您可以让CarBrand字段包含一个公式,如=[CarBrand]&,很抱歉,最后一个字段将包含一个不必要的逗号。如果某个特定用户的品牌数量超过了您报告的数量,则它们将被均匀地隔开,并将分成新行。如果您只创建一个逗号分隔的大字符串,则很难做到这一点


根本不涉及VBA

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

我正在为一家非营利机构的DB工作,该机构有导师和课程。对于大多数班级来说,只有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

显然,要将三列合并为一列,还需要一个未显示的额外步骤。

建议的表格不是第一个标准表格。考虑使用报告或其他“前端”工具进行显示。另外,考虑到在StAcExver上最多的投票是在SQL中而不是在前端进行格式化。我不认为在报告中也有一种简单的方法来实现这一点,您仍然需要使用VBA函数。
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