2017-02-10 58 views
0

列表考虑一下这个表:SQL命令检索嵌套在

Employees Segment  Function  
John  Retail  Sales 
Peter  Retail  Sales 
Lucas  Retail  Sales 
Steve  Retail  Sales 
Maria  Retail  Sales 

我希望得到的名单,像这样:(别名第一列)

'Area' 'Employees' 
Retail John,Lucas,Maria 
Sales John,Lucas,Maria 

要组装查询我有只有员工名单。所以条件应该是这样的:

WHERE Employees IN('John','Maria','Lucas'). 

我只有访问查询数据库。

我可以在一排安装的员工名单,像这样:

SELECT 
Employees = Stuff(
    (SELECT N', ' + Employees FROM table A WHERE Employees 
     IN('John','Maria','Lucas') FOR XML PATH(''),TYPE) 
    .value('text()[1]','nvarchar(max)'),1,2,N''); 

,我还可以通过合并细分和功能类似这样的创建“区域”:

SELECT Segment 'Area' FROM table 
WHERE Employees IN('John','Maria','Lucas') 
UNION SELECT Function 'Area' FROM table 
WHERE Employees IN('John','Maria','Lucas') 

我会喜欢只是合并使用的东西作为UNION这两个选择,就像这样:

SELECT 
    Employees = Stuff(
     (SELECT N', ' + Employees FROM table A WHERE Employees 
      IN('John','Maria','Lucas') FOR XML PATH(''),TYPE) 
     .value('text()[1]','nvarchar(max)'),1,2,N'') 
    UNION 
    SELECT Segment 'Area' FROM table 
    WHERE Employees IN('John','Maria','Lucas') 
    UNION SELECT Function 'Area' FROM table 
    WHERE Employees IN('John','Maria','Lucas') 

结果出来了,如:

'Employees' 
John,Maria,Lucas 
Retail 
Sales 

也许我错过了关于UNION语法的一些细节,或者它并不像我期望的那么简单。

+1

哪些DBMS你实际使用?你标记了sql server和mysql,但是你在你的问题中提到了PL/SQL(Oracle)。 –

+1

另外,你需要定义“没有工作”。那是什么意思? –

+1

我想你可能正在寻找GROUP_CONCAT – RiggsFolly

回答

0

你仍然可以使用你的UNION,你只需要做两次STUFF()。

SELECT DISTINCT Segment AS 'Area' 
       , Stuff((SELECT N', ' + Employees 
         FROM table A 
         WHERE Employees IN('John','Maria','Lucas') 
         FOR XML PATH(''),TYPE).value('text()[1]','nvarchar(max)'),1,2,N'') FROM table 
WHERE Employees IN ('John','Maria','Lucas') 
UNION 
SELECT DISTINCT Func AS 'Area' 
      , Stuff((SELECT N', ' + Employees 
        FROM table A 
        WHERE Employees IN('John','Maria','Lucas') 
        FOR XML PATH(''),TYPE).value('text()[1]','nvarchar(max)'),1,2,N'') FROM table 
WHERE Employees IN ('John','Maria','Lucas') 
+0

回报真棒,男人!你钉了它。 – user3250439

+1

刚刚编辑您的查询以添加第二行的别名: FOR XML PATH(''),TYPE).value('text()[1]','nvarchar(max)'),1,2,N '')为'员工'; 它是作为'没有名字列'返回 – user3250439

0

希望,这将满足您的要求。

尝试它在sqlfiddle,工作正常。

SELECT a.Fun Area, 
     SUBSTRING(d.Employees,1, LEN(d.Employees) - 1) Employees 
FROM(SELECT DISTINCT Fun FROM test_so) a 
     CROSS APPLY 
     (SELECT [Employees] + ', ' FROM test_so AS B WHERE A.Fun = B.Fun FOR XML PATH('') 
     ) D (Employees)  
UNION 
SELECT a.Segment Area, SUBSTRING(d.Employees,1, LEN(d.Employees) - 1) Employees 
FROM(SELECT DISTINCT Segment FROM test_so) a 
     CROSS APPLY 
     (SELECT [Employees] + ', ' FROM test_so AS B WHERE A.Segment = B.Segment FOR XML PATH('') 
     ) D (Employees) 

enter image description here

+0

我试图复制你的小提琴,并不能使它的工作。语法不清晰,但它看起来非常优雅。你能再详细一点吗?或者提供SQLFiddle链接? – user3250439

+0

请检查此链接http://sqlfiddle.com/#!6/e93ab/1/0 – Tajinder