gpt4 book ai didi

sql - 根据第三列中的类型代码将列拆分为两列

转载 作者:行者123 更新时间:2023-12-01 23:33:01 26 4
gpt4 key购买 nike

我的 SQL 很生疏。我正在尝试转换此表:

+----+-----+--------------+-------+
| ID | SIN | CONTACT | TYPE |
+----+-----+--------------+-------+
| 1 | 737 | b@bacon.com | email |
| 2 | 760 | 250-555-0100 | phone |
| 3 | 737 | 250-555-0101 | phone |
| 4 | 800 | 250-555-0102 | phone |
| 5 | 850 | l@lemon.com | email |
+----+-----+--------------+-------+

进入这张表:

+----+-----+--------------+-------------+
| ID | SIN | PHONE | EMAIL |
+----+-----+--------------+-------------+
| 1 | 737 | 250-555-0101 | b@bacon.com |
| 2 | 760 | 250-555-0100 | |
| 4 | 800 | 250-555-0102 | |
| 5 | 850 | | l@lemon.com |
+----+-----+--------------+-------------+

我写了这个查询:

SELECT *
FROM (SELECT *
FROM people
WHERE TYPE = 'phone') phoneNumbers
FULL JOIN (SELECT *
FROM people
WHERE TYPE = 'email') emailAddresses
ON phoneNumbers.SIN = emailAddresses.SIN;

产生:

+----+-----+--------------+-------+------+-------+-------------+--------+
| ID | SIN | CONTACT | TYPE | ID_1 | SIN_1 | CONTACT_1 | TYPE_1 |
+----+-----+--------------+-------+------+-------+-------------+--------+
| 2 | 760 | 250-555-0100 | phone | | | | |
| 3 | 737 | 250-555-0101 | phone | 1 | 737 | b@bacon.com | email |
| 4 | 800 | 250-555-0102 | phone | | | | |
| | | | | 5 | 850 | l@lemon.com | email |
+----+-----+--------------+-------+------+-------+-------------+--------+

我知道我可以选择我想要的列,但是 SIN 列不完整。我似乎记得我应该第三次加入该表以获得完整的 SIN 列,但我不记得如何。

如何生成目标表(ID、SIN、PHONE、EMAIL)?

编辑和澄清:我很感谢到目前为止收到的答复,但作为一个 SQL 新手,我不熟悉您使用的技术(case 语句、条件聚合和数据透视)。这不能使用 JOIN 和 SELECT 来完成吗?请原谅我在这件事上的无知。 (不是我对高超的技术不感兴趣,而是我不想 Action 太快太快。)

最佳答案

解决这个问题的一种方法是条件聚合:

select min(ID), SIN, 
max(case when type = 'phone' then contact end) as phone,
max(case when type = 'email' then contact end) as email
from people t
group by sin;

关于sql - 根据第三列中的类型代码将列拆分为两列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24270940/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com