SQL Server中的高级分组

时间:2014-09-24 12:50:55

标签: sql sql-server

我有一张如下所述的表格:

-------------------------------  
EmpID  | Name     | Salary  
-------------------------------  
1      | AAA      | 10000
2      | BBB      | 10000
3      | CCC      | 15000
4      | DDD      | 15000
5      | EEE      | 20000
--------------------------------  

我想编写一个SQL查询来对表值进行分组,如下所述:

---------------------  
Salary  |  Name  
---------------------  
10000   |  AAA  
        |  BBB
15000   |  CCC  
        |  DDD
20000   |  EEE
---------------------  

帮助我在sql server中使用sql查询实现输出。

2 个答案:

答案 0 :(得分:1)

不完全是您想要的,但您可以在一列中列出所有名称,如下所示:

Salary  |  Name  
---------------------  
10000   |  AAA, BBB
15000   |  CCC, DDD
20000   |  EEE

以下基于this answer的查询应该给出以上结果:

SELECT Salary, STUFF(( SELECT ', ' + Name FROM Employees a
WHERE b.Salary = a.Salary FOR XML PATH('')), 1, 1, '') Name
FROM Employees b
GROUP BY Salary;

答案 1 :(得分:1)

您的请求通常必须在Excel或其他类似软件下运行,但......

我模仿GROUP BY行为,因此您只会获得工资值的行,而另一行的工资相同且值为NULL:

create table salary(empid int, name varchar(10), wage int);

insert into salary values
(1, 'AAA', 10000),
(2, 'BBB', 10000),
(3, 'CCC', 15000),
(4, 'DDD', 15000),
(5, 'EEE', 20000);

SELECT s1.name, 
CASE
    WHEN NOT EXISTS(
       SELECT 'X'
       FROM salary s3
       WHERE s3.empid < s1.empid
       AND s3.wage = s1.wage
    )
    THEN
       (SELECT wage FROM salary s2
       WHERE s2.name = s1.name)
    ELSE NULL
END
FROM salary s1
ORDER BY wage

SELECT获取所有员工,并且对于工资组的第一个员工ID,它显示工资else显示为NULL。

这不是你想要的,但它确实是相似的

SqlFiddle