如何将此查询 sql 服务器连接在一起?

How can I join together this querys sql server?

SQL FIDDLE DEMO HERE

我有这个 table 工人结构 table:

    CREATE TABLE Workers
(
     [Name] varchar(250),
     [IdWorker] varchar(250),    
     [work] varchar(250)
);

INSERT INTO Workers ([Name],  [IdWorker],  [work])
values 
('Sam', '001', 'Director'),
('Julianne', '002', 'Recepcionist'),
('Jose', '003', 'Recepcionist');

我想要的是为每个工作获取用逗号分隔的工人姓名,如下所示:

Director   Recepcionist
-------    ------------
Sam         Julianne, Jose

我尝试使用这个查询:

 DECLARE @rec VARCHAR(MAX) 
 SELECT @rec = COALESCE(@rec + ', ', '') + Name from 
Workers where job = 'Recepcionist'  SELECT @dir AS Recepcionist

我得到了这个结果:

Recepcionist
------------
Julianne, Jose

这只适用于一项工作,但我需要添加更多,所以我尝试使用这个查询:

SELECT  [Director] , [Recepcionist] 
FROM 
(SELECT [job],  [Name],RANK() OVER (PARTITION BY [job] ORDER BY [job],[Name]) as rnk
 FROM Workers ) p
 PIVOT(
Min([Name])
FOR [job] IN
( [Director] , [Recepcionist] )
) AS pvt

我得到了这个结果:

Director  Recepcionist
--------  ------------
Sam       Julianne
          Jose

我需要在同一行中获取以逗号分隔的结果,如何合并这两个查询? 我接受建议,谢谢。

你可以这样做

SELECT
    t1.job
        ,STUFF(
                   (SELECT
                        ', ' + t2.Name
                        FROM Workers t2
                        WHERE t1.job =t2.job 
                        ORDER BY t2.Name
                        FOR XML PATH(''), TYPE
                   ).value('.','varchar(max)')
                   ,1,2, ''
              ) AS ChildValues
    FROM Workers t1
    GROUP BY t1.job 

我假设在您的示例查询中您指的是引用工作列的工作。以下查询应根据您的 sql fiddle 完成工作。

    SELECT  STUFF(
                    (
                        SELECT  ', ' + cast([Name] as varchar(max))
                        FROM    Workers
                        WHERE   [work] = 'Recepcionist'
                        FOR XML PATH('')
                    ), 1, 2, ''
            ) AS Recepcionist
            ,STUFF(
                (
                    SELECT  ', ' + cast([Name] as varchar(max))
                    FROM    Workers
                    WHERE   [work] = 'Director'
                    FOR XML PATH('')
                ), 1, 2, '') AS Director;

使用 PIVOT 执行此操作的方式如下。

SELECT  * 
FROM    (SELECT [work],
                STUFF((SELECT   ', ' + [Name]
                        FROM    Workers s
                        WHERE   s.WORK = w.WORK
                        FOR XML PATH('')),
                        1, 2, '') AS [workers]              
         FROM   Workers w) t
PIVOT (
    MAX([workers])
    FOR [work] IN ([Director], [Recepcionist])
) p

PIVOT 的另一个替代方法是 MAX(CASE)

SELECT  MAX(CASE WHEN [work] = 'Director' THEN [workers] END) AS [Director], 
        MAX(CASE WHEN [work] = 'Recepcionist' THEN [workers] END) AS [Recepcionist]
FROM    (SELECT [work],
                STUFF((SELECT   ', ' + [Name]
                        FROM    Workers s
                        WHERE   s.WORK = w.WORK
                        FOR XML PATH('')),
                        1, 2, '') AS [workers]              
         FROM   Workers w) t

这两个都允许您按公司或部门等其他字段分隔数据