【问题标题】:MySQL: Group ids and display different values on a separate columnMySQL:分组 id 并在单独的列上显示不同的值
【发布时间】:2017-09-05 00:02:40
【问题描述】:

如何只在一行中显示不同电话号码的员工,其中电话号码按列显示?

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,然后再进行一次查询以获取他们的电话号码,但这将进行2次查询。此处的目标是仅使用 1 个查询语句来实现此输出。

【问题讨论】:

    标签: php mysql database mysqli


    【解决方案1】:

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

    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;
    

    Case 表达式用于检查是否有多个不同的电话号码,然后只显示第二个号码,否则显示 null。如果您只想检查计数(而不是不同的电话号码),也可以使用 count

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

    【讨论】:

    • 哇!伟大的!正是我想要的!虽然我想知道它是否可以动态处理员工的电话号码?我认为它将首先获得电话号码最多的员工并创建列然后填写列。有可能吗?
    • @basagabi - 如果员工可以拥有的电话号码数量有上限,那么在 SQL 中是可能的(通过一些技巧。建议使用应用程序代码)。如果它是完全动态的,那么您将需要动态 SQL。然而,这将是一个新问题。
    猜你喜欢
    • 2021-11-08
    • 2021-11-08
    • 2023-04-10
    • 2014-11-17
    • 1970-01-01
    • 2012-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多