2017-04-10 63 views
2

如何在一行中显示不同电话号码的员工,其中电话号码按列显示?MySQL:组ID并在不同的列上显示不同的值

Create Table Employees(
    Employee_ID INT, 
    PhoneNumber VARCHAR(50) 
); 

INSERT INTO Employees VALUES (1,'111'),(1,'222'),(2,'111'),(2,'222'),(3,'111'),(3,'222'),(4,'111'),(5,'111'),(5,'222') 

这是我试过的,但它似乎没有工作。

SELECT * 
FROM Employees 
WHERE PhoneNumber IN (
    SELECT PhoneNumber 
    FROM Employees 
    GROUP BY PhoneNumber 
    HAVING COUNT(Employee_ID) > 1 
    ) 

你可以检查出来这个SQL Fiddle.

输出应该是:

Employee_ID | PhoneNumber_1 | PhoneNumber_2 
1   | 111   | 222 
2   | 111   | 222 
3   | 111   | 222 
4   | 111   | null 
5   | 111   | 222 

假设每一个员工只会有两个电话号码的最大值。

这甚至可能使用mysql来显示这种结果吗?另一种方法是只获得employee_ids这个组,然后再做一个查询来获得他们的phonenumbers,但是这会做2个查询。这里的目标是仅使用1个查询语句来实现此输出。

回答

2

您可以使用聚合数据透视。

SELECT 
    Employee_ID, 
    min(PhoneNumber) as Phone1, 
    case when min(PhoneNumber) <> max(PhoneNumber) then max(PhoneNumber) end as Phone2 
FROM Employees 
group by Employee_ID; 

为例表达式用来检查是否有多于一个的不同的电话号码,然后仅显示所述第二数目,否则显示空。如果您只想检查计数(而不是不同的电话号码),您也可以使用count

​​
+0

哇!大!正是我在找的!虽然我想知道它是否可以动态处理员工的电话号码数量?我在想,它会首先获得最多电话号码的员工,然后创建列并填写列。它甚至有可能吗? – basagabi

+1

@basagabi - 如果员工可以拥有电话号码的数量上限,那么可以通过SQL(通过一些黑客行为,建议使用应用程序代码)。如果它是完全动态的,那么你需要动态SQL。然而,这将是一个新问题。 – GurV

+0

@GurV你可以帮我在这里https://stackoverflow.com/questions/43319465/how-do-i-create-mysql-procedure-to-loop-through-table – user3637224

相关问题