如何将多行合并为一行?SQL PostgreSQL管理员
我已经根据它们的公共ID映射了两个表,但我希望将与特定公司关联的所有电话号码都放在一行,而不是多行,分为三列“电话”、“传真”和“免费”。下面是数据输出的示例如何将多行合并为一行?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
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将它“折叠”为每个公司名称的单个记录。如果要删除它们,您将看到您将有多个记录。