如何将多行合并为一行?SQL PostgreSQL管理员

如何将多行合并为一行?SQL PostgreSQL管理员,sql,postgresql,Sql,Postgresql,我已经根据它们的公共ID映射了两个表,但我希望将与特定公司关联的所有电话号码都放在一行,而不是多行,分为三列“电话”、“传真”和“免费”。下面是数据输出的示例 Dr. Dimes 5553456879 Telephone Dr. Dimes 5553455600 Toll Free Dr. Dimes 5553450123 Fax 选择 舰队。公司名称, 电话号码,电话号码, phone\u type.name 从…起 fleetseek.phone_号码, fleetsee

我已经根据它们的公共ID映射了两个表,但我希望将与特定公司关联的所有电话号码都放在一行,而不是多行,分为三列“电话”、“传真”和“免费”。下面是数据输出的示例

Dr. Dimes   5553456879  Telephone
Dr. Dimes   5553455600  Toll Free
Dr. Dimes   5553450123  Fax
选择
舰队。公司名称,
电话号码,电话号码,
phone\u type.name
从…起
fleetseek.phone_号码,
fleetseek.phone_类型,
舰队,舰队,
fleetseek.fleet\u电话
哪里
phone\u number.phone\u type\u id=phone\u type.phone\u type\u id和
fleet.fleet\u id=fleet\u phone.fleet\u id和
fleet\u phone.phone\u number\u id=phone\u number.phone\u number\u id

当您三次使用同一个表时,可以通过连接和别名来获得一行中的所有列:

    SELECT
      fleet.company_name,
      telephone.phone_number AS Telephone,
      toll_free.phone_number AS Toll_Free,
      fax.phone_number AS Fax
    FROM 
      fleetseek.fleet
    JOIN 
      fleet_phone
    ON 
      fleet.fleet_id = fleet_phone.fleet_id
    LEFT OUTER JOIN (SELECT 
            phone_number
          FROM 
            fleetseek.phone_number, 
            fleetseek.phone_type
          WHERE 
            phone_number.phone_type_id = phone_type.phone_type_id AND
            phone_type.name = 'Telephone') telephone
    ON  
      fleet_phone.phone_number_id = telephone.phone_number_id
    LEFT OUTER JOIN 
      (SELECT 
         phone_number
       FROM 
         fleetseek.phone_number, 
         fleetseek.phone_type
       WHERE 
         phone_number.phone_type_id = phone_type.phone_type_id AND
         phone_type.name = 'Toll Free') toll_free
    ON  
      fleet_phone.phone_number_id = toll_free.phone_number_id
    LEFT OUTER JOIN 
      (SELECT 
         phone_number
       FROM 
         fleetseek.phone_number, 
         fleetseek.phone_type
       WHERE 
         phone_number.phone_type_id = phone_type.phone_type_id AND
         phone_type.name = 'Fax') fax
    ON  
      fleet_phone.phone_number_id = fax.phone_number_id;

一般设计选择建议:如果信息非常重要,请将手机类型与手机号码放在同一张表中。必须添加连接会影响性能(同时会影响空间)。一般来说,性能比空间更昂贵。

当您三次使用同一个表时,可以通过连接和别名来获得一行中的所有列:

    SELECT
      fleet.company_name,
      telephone.phone_number AS Telephone,
      toll_free.phone_number AS Toll_Free,
      fax.phone_number AS Fax
    FROM 
      fleetseek.fleet
    JOIN 
      fleet_phone
    ON 
      fleet.fleet_id = fleet_phone.fleet_id
    LEFT OUTER JOIN (SELECT 
            phone_number
          FROM 
            fleetseek.phone_number, 
            fleetseek.phone_type
          WHERE 
            phone_number.phone_type_id = phone_type.phone_type_id AND
            phone_type.name = 'Telephone') telephone
    ON  
      fleet_phone.phone_number_id = telephone.phone_number_id
    LEFT OUTER JOIN 
      (SELECT 
         phone_number
       FROM 
         fleetseek.phone_number, 
         fleetseek.phone_type
       WHERE 
         phone_number.phone_type_id = phone_type.phone_type_id AND
         phone_type.name = 'Toll Free') toll_free
    ON  
      fleet_phone.phone_number_id = toll_free.phone_number_id
    LEFT OUTER JOIN 
      (SELECT 
         phone_number
       FROM 
         fleetseek.phone_number, 
         fleetseek.phone_type
       WHERE 
         phone_number.phone_type_id = phone_type.phone_type_id AND
         phone_type.name = 'Fax') fax
    ON  
      fleet_phone.phone_number_id = fax.phone_number_id;

一般设计选择建议:如果信息非常重要,请将手机类型与手机号码放在同一张表中。必须添加连接会影响性能(同时会影响空间)。通常,性能比空间更昂贵。

最简单的方法可能是使用聚合:

SELECT 
  fleet.company_name,
  MAX(CASE WHEN phone_type.name = 'Telephone' THEN phone_number.phone_number END) AS telephone,
  MAX(CASE WHEN phone_type.name = 'Toll Free' THEN phone_number.phone_number END) AS toll_free,
  MAX(CASE WHEN phone_type.name = 'Fax' THEN phone_number.phone_number END) AS fax
FROM 
  fleetseek.phone_number, 
  fleetseek.phone_type, 
  fleetseek.fleet, 
  fleetseek.fleet_phone
WHERE 
  phone_number.phone_type_id = phone_type.phone_type_id AND
  fleet.fleet_id = fleet_phone.fleet_id AND
  fleet_phone.phone_number_id = phone_number.phone_number_id
GROUP BY
  fleet.company_name;

最简单的方法可能是使用聚合:

SELECT 
  fleet.company_name,
  MAX(CASE WHEN phone_type.name = 'Telephone' THEN phone_number.phone_number END) AS telephone,
  MAX(CASE WHEN phone_type.name = 'Toll Free' THEN phone_number.phone_number END) AS toll_free,
  MAX(CASE WHEN phone_type.name = 'Fax' THEN phone_number.phone_number END) AS fax
FROM 
  fleetseek.phone_number, 
  fleetseek.phone_type, 
  fleetseek.fleet, 
  fleetseek.fleet_phone
WHERE 
  phone_number.phone_type_id = phone_type.phone_type_id AND
  fleet.fleet_id = fleet_phone.fleet_id AND
  fleet_phone.phone_number_id = phone_number.phone_number_id
GROUP BY
  fleet.company_name;

@nicarus当加入多个tables@nicarus这在加入多个表时可能吗谢谢,这里的逻辑很有用!Hi@Nicarus案例陈述前面的最大值或最小值实现了什么?这似乎是我先前尝试中丢失的部分。@GarrickBrim It将它“折叠”为每个
公司名称的单个记录。如果您要删除它们,您将看到您将拥有多个记录。谢谢,这里的逻辑帮助了您!Hi@Nicarus案例陈述前面的最大值或最小值实现了什么?这似乎是我先前尝试中丢失的部分。@GarrickBrim It将它“折叠”为每个
公司名称的单个记录。如果要删除它们,您将看到您将有多个记录。