SQL查询以获取具有组名的客户列表

Posted

技术标签:

【中文标题】SQL查询以获取具有组名的客户列表【英文标题】:SQL query to get list of customers with group name 【发布时间】:2014-08-02 05:29:10 【问题描述】:

我有以下表格

客户表

客户 ID 客户名称

组表

GroupId 组名

Customer_Group 表

客户 ID GroupId

客户可能属于也可能不属于某个组。如果它们属于任何/多个组,则在 Customer_Group 表中创建一个条目。我需要一个 SQL 查询来列出所有客户及其组名。如果它们不属于任何组,则它可以显示 NULL。否则,组名应显示为逗号分隔。例如如下

CustomerId   CustomerName   GroupName
1            ABC            NULL 
2            DEF            Sales,Marketing

客户表数据如下

CustomerId  CustomerName   
1           ABC
2           DEF

组表数据如下

GroupId   GroupName
1         Sales
2         Marketing

Customer_Group 数据如下

CustomerId GroupId   
2          1
2          2

请帮助我进行 SQL 查询,该查询将列出所有客户及其组名。我正在使用 Microsoft SQL Server 2005。提前致谢。

【问题讨论】:

如果你花更多的时间来设计你的表结构,你的 sql 查询会简单得多。例如,您可以通过简单地将 groupID 列添加到您的客户表并完全删除 Customer_Group 表来减少重复和减少一个表。有很多方法可以做到这一点。没有一种方法是正确的,但您可以避免在 SQL 中使用复杂的连接语句。 @JasonEnochs 如果客户和团体之间存在多对多关系,则将不起作用,正如问题所建议的那样。 您使用的是哪个 DBMS?后格雷斯?甲骨文? 我使用的是 Microsoft SQL Server 2005 @strawberry 有问题的是编写如下 SQL 语句来查询如此琐碎的事情。 【参考方案1】:

可能是这样的

SELECT C.CustomerId, C.CustomerName,
       GroupName = STUFF(
         (SELECT ',' + GI.GroupName FROM [Group] AS GI           
           INNER JOIN Customer_Group AS CGI ON CGI.GroupId = GI.GroupId
           WHERE CGI.CustomerId = C.CustomerId
           FOR XML PATH, TYPE).value('.[1]', 'nvarchar(max)'), 1, 1, '')
FROM Customer C LEFT JOIN Customer_Group CG ON C.CustomerId = CG.CustomerId
GROUP BY C.CustomerId, C.CustomerName

FIDDLE DEMO


输出将是

CustomerId   CustomerName   GroupName
+------------------------------------+
1            ABC            NULL 
2            DEF            Sales,Marketing

【讨论】:

嗨@vignesh-kumar 我试过这个查询,组名显示为逗号分隔。但是,显示的结果是错误的。即使客户不属于任何组,它也会显示所有客户的组 @Frenz 检查这个小提琴。它工作正常sqlfiddle.com/#!3/f81bb/1。我认为您可以测试我更新的查询

以上是关于SQL查询以获取具有组名的客户列表的主要内容,如果未能解决你的问题,请参考以下文章

如何从由 SQL 查询填充的列表框中获取信息?

用于从多个表中查找具有表名的所有记录的 SQL 查询

通过 JPA 标准查询从 SQL 视图获取列表时出错

SQL查询从列表中获取前“n”个分数

如何编写一个显示仅分配给登录用户的列表的 SQL 查询?

SQL查询以获取从当前月份开始的月份列表