从一列的多行创建一个逗号分隔的字符串?

时间:2011-10-13 08:02:19

标签: 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,可能使用COALESCE替代?)创建一个逗号分隔的字符串,没有Name:部分?

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

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

3 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:0)

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

创建一个包含用户名列表及其汽车品牌的子报表。加入UserName上的表单。在子窗体的设计中,使用4-5列水平打印。您可以让CarBrand字段包含类似= [CarBrand]&的公式。 “,”(对不起,最后一个会有一个不必要的逗号。如果某个特定用户拥有的品牌数量超过您的报告范围,那么它们将会统一间隔并且会突破新的行(这将很难做到如果您只是创建一个以逗号分隔的大字符串。)。

根本没有涉及VBA。

答案 2 :(得分:0)

如果您不需要逗号分隔列表中的每个值,但只说前三个或前四个,那么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个额外的步骤(未显示)。