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查询以获取具有组名的客户列表的主要内容,如果未能解决你的问题,请参考以下文章