如何将多行组合成一行? SQL PostgreSQL管理员

如何将多行组合成一行? SQL PostgreSQL管理员

问题描述:

我已经根据公共ID映射了两个表,但我希望将所有与特定公司关联的电话号码放在一行而不是多行中,分为三列“电话”,“传真” ,和“免费电话”。以下是数据输出的示例。如何将多行组合成一行? SQL PostgreSQL管理员

Dr. Dimes 5553456879 Telephone 
Dr. Dimes 5553455600 Toll Free 
Dr. Dimes 555345Fax 
SELECT 
    fleet.company_name, 
    phone_number.phone_number, 
    phone_type.name 
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 
+0

http://*.com/questions/28804776/postgresql-9-3-pivot-table – Nicarus

+0

@nicarus这是可能的当加入多个表 –

也许是最简单的方式做,这是使用聚合:

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; 
+0

谢谢,这里的逻辑帮助! –

+0

Hi @Nicarus CASE语句前面的MAX或MIN是什么意思?对于我以前的尝试来说,这似乎是缺失的部分。 –

+0

@GarrickBrim它将每个“company_name”“折叠”为一条记录。如果你要删除它们,你会看到你会有不止一条记录。 – Nicarus

可以实现通过连接获得一个行的所有列,和混叠当您使用相同的表三次:

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; 

通用设计选择的建议:把你的如果该信息非常重要,则电话会在与您的电话号码相同的表格中键入。不得不添加连接会影响性能(同时影响空间)。通常,性能比空间更昂贵。

+0

我欣赏它 –