【问题标题】:comma separated names based on company ID基于公司 ID 的逗号分隔名称
【发布时间】:2015-06-15 07:33:32
【问题描述】:

我有下面的员工详细信息表

EmployeeName   CompayId    CompanyLastActive
---------------------------------------------------------
robort          112        10 Jun 2015 09:30 
john            113        11 Jun 2015 11:10
sunny           114        14 Jun 2015 16:10
sumanth         114        15 Jun 2015 18:11
usha            115        07 Jun 2015 13:14
sudheer         115        14 Jun 2015 17:10
sweety          115        08 Jun 2015 16:34

我需要根据 CompanyID 以逗号分隔的 EmployeeName 获取最新的员工活动时间,如下所示

EmployeeName           CompayId        CompanyLastActive
---------------------------------------------------------
robort                 112               10 Jun 2015 09:30 
john                   113               11 Jun 2015 11:10
sunny, sumanth         114               15 Jun 2015 18:11        
usha, sudheer, sweety   115               14 Jun 2015 17:10

请帮我解决一下。

【问题讨论】:

  • 你用的是全部3个版本的sql server吗?
  • @ZoharPeled:我也在那个房间里。这个问题与那个问题有点不同。在这里,OP 想要在一行中有不同的 记录,而在那个问题中,OP 试图将多个 列 放在一个行中(不包括 NULL)。

标签: sql-server sql-server-2008 sql-server-2008-r2 sql-server-2012


【解决方案1】:
SELECT EmployeeName = STUFF((
          SELECT ',' + e1.EmployeeName
          FROM dbo.Employee e1
          WHERE e.CompayId = e1.CompayId
          FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, ''),
        e.CompayId,
        MAX(CompanyLastActive) as CompanyLastActive
FROM dbo.Employee e
GROUP BY e.CompayID
ORDER BY e.CompayId

结果:

EmployeeName        CompayId    CompanyLastActive
-------------------------------------------------------
robort              112         June, 10 2015 09:30:00
john                113         June, 11 2015 11:10:00
sunny,sumanth       114         June, 15 2015 18:11:00
usha,sudheer,sweety 115         June, 14 2015 17:10:00

SQL Fiddle 中的示例结果。

【讨论】:

    【解决方案2】:

    检查一下,我没有检查过,因为我懒得构建架构,它可能会错误地抛出组,你可以处理它

    SELECT 
      Results.CompayId,
      STUFF((
        SELECT ', ' + CAST(EmployeeName AS VARCHAR(MAX)) 
        FROM YourTable 
        WHERE (ID = Results.ID) 
        FOR XML PATH(''),TYPE).value('(./text())[1]','VARCHAR(MAX)')
      ,1,2,'') AS NameValues
      ,max(Results.CompanyLastActive) as CompanyLastActive
    FROM YourTable Results
    GROUP BY CompayId
    

    【讨论】:

      【解决方案3】:

      你可以使用这个查询:

      SELECT EmployeeNames = dbo.EmployeeNamesPerCompany(CompanyID,', '), 
             CompanyID, 
             CompanyLastActive = MAX(CompanyLastActive)
      FROM Employee e
      GROUP BY CompanyID
      ORDER BY MAX(CompanyLastActive)
      

      如果您已经创建了这样的标量值函数:

      CREATE FUNCTION [dbo].[EmployeeNamesPerCompany]
      (
          @companyID Int,
          @delimiter varchar(5)
      )
      RETURNS VARCHAR(8000)
      AS
      BEGIN
          DECLARE @Names VARCHAR(8000) 
          SELECT   @Names = COALESCE(@Names + @delimiter, '') + e.EmployeeName
          FROM    Employee e
          WHERE e.CompanyId = @companyID
          ORDER BY e.EmployeeName
          return @Names
      END
      

      Sql-Fiddle Demo

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多