【问题标题】:Comma Separated List as part of a SQL SELECT Results逗号分隔列表作为 SQL SELECT 结果的一部分
【发布时间】:2011-09-16 04:43:48
【问题描述】:

我想返回一份员工列表、有关他们的各种信息以及一列,其中列出了他们每月分配给他们的前 3 个项目的列表,以逗号分隔的列表形式。我有一个成功返回小时数的 select 语句,但我不确定如何将它嵌入到 select statemnet 中。下面是选择语句。我正在尝试在 SQL Server 中执行此操作。

        DECLARE @Projects varchar(max)
    SELECT Top(3) @Projects = COALESCE(@Projects+', ' ,'') + ltrim(rtrim(Projects.Title))
                FROM         EmployeeProjectPlanning INNER JOIN
                  Projects ON EmployeeProjectPlanning.ProjectID = Projects.ProjectID
                WHERE     (EmployeeProjectPlanning.EmpID = 1) AND (EmployeeProjectPlanning.MonthID = 9) AND (EmployeeProjectPlanning.Year = 2011)
                ORDER BY EmployeeProjectPlanning.Hours DESC
    SELECT @Projects

【问题讨论】:

  • 拜托,拜托,请告诉我们您使用的是什么 SQL 产品。 MySQL 和 SQLite 会使用 GROUP_CONCAT 来完成此操作,在 SQL Server 中您需要编写一个标量存储过程来完成此操作。
  • 从语法判断,是 MS SQL。此外,如果访问权限允许,我发现为此目的创建一个聚合 CLR 函数来模仿 MySQL 的 group_concat 很有用。

标签: sql


【解决方案1】:

假设您使用的是 SQL 2005 或更高版本,您可以使用FOR XML 在一个字段中创建逗号分隔列表。只需将以下内容放在您需要项目列的SELECT 语句中:

SUBSTRING(
    (SELECT TOP (3) ','+ltrim(rtrim(Projects.Title)) 
     FROM  EmployeeProjectPlanning AS emp
     INNER JOIN Projects as proj ON emp.ProjectID = proj.ProjectID
     WHERE (emp.EmpID = 1)
        AND (emp.MonthID = 9)
        AND (emp.Year = 2011)
     ORDER BY emp.Hours DESC
    FOR XML PATH('')
),2,8000) AS Projects

【讨论】:

    猜你喜欢
    • 2010-10-14
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    相关资源
    最近更新 更多