如何将此查询 sql 服务器连接在一起?
How can I join together this querys sql server?
我有这个 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
这两个都允许您按公司或部门等其他字段分隔数据
我有这个 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
这两个都允许您按公司或部门等其他字段分隔数据